home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 2 / The 640 Meg Shareware Studio CD-ROM Volume II (Data Express)(1993).ISO / clang / nn.zip / PATCH04 < prev    next >
Text File  |  1989-07-11  |  114KB  |  4,546 lines

  1. *** /usr/storm/nn6.3.3/patchlevel.h    Fri Jun 30 11:30:40 1989
  2. --- patchlevel.h    Mon Jul 10 12:40:46 1989
  3. ***************
  4. *** 11,17 ****
  5.    *    1989-06-06:  Patch 1: rc.c
  6.    *    1989-06-28:  Patch 2: several files
  7.    *    1989-06-30:  Patch 3: several files
  8.    */
  9.   
  10. ! #define PATCHLEVEL 3
  11.   
  12. --- 11,18 ----
  13.    *    1989-06-06:  Patch 1: rc.c
  14.    *    1989-06-28:  Patch 2: several files
  15.    *    1989-06-30:  Patch 3: several files
  16. +  *    1989-07-10:  Patch 4: several files
  17.    */
  18.   
  19. ! #define PATCHLEVEL 4
  20.   
  21.  
  22. *** /usr/storm/nn6.3.0/admin.c    Thu Jun  1 11:10:41 1989
  23. --- admin.c    Wed Jul  5 14:54:49 1989
  24. ***************
  25. *** 34,40 ****
  26.           raw();
  27.       c = get_c();
  28.       no_raw();
  29. !     printf("%c\n\n\r", c);
  30.       }
  31.       
  32.       if (islower(c)) 
  33. --- 34,43 ----
  34.           raw();
  35.       c = get_c();
  36.       no_raw();
  37. !     if (c == K_interrupt)
  38. !         s_keyboard++;
  39. !     else
  40. !         printf("%c\n\n\r", c);
  41.       }
  42.       
  43.       if (islower(c)) 
  44. ***************
  45. *** 49,55 ****
  46.   long min_val, max_val;
  47.   {
  48.       char buf[100];
  49. !     int val;
  50.       
  51.    loop:
  52.       
  53. --- 52,58 ----
  54.   long min_val, max_val;
  55.   {
  56.       char buf[100];
  57. !     long val;
  58.       
  59.    loop:
  60.       
  61. ***************
  62. *** 56,63 ****
  63.       printf("%s %ld..%ld (or all): ", prompt_str, min_val, max_val);
  64.       fl;
  65.       gets(buf);
  66. !     if (buf[0] == 'a')
  67. !     return -1;
  68.   
  69.       val =  atol(buf);
  70.       if (val < min_val || val > max_val) goto loop;
  71. --- 59,66 ----
  72.       printf("%s %ld..%ld (or all): ", prompt_str, min_val, max_val);
  73.       fl;
  74.       gets(buf);
  75. !     if (buf[0] == 'a' || buf[0] == NUL)
  76. !     return -1L;
  77.   
  78.       val =  atol(buf);
  79.       if (val < min_val || val > max_val) goto loop;
  80. ***************
  81. *** 181,187 ****
  82.   static master_admin()
  83.   {
  84.       register char c;
  85. !     int cur_group, value;
  86.       register group_header *gh;
  87.   
  88.       for (;;) {
  89. --- 184,191 ----
  90.   static master_admin()
  91.   {
  92.       register char c;
  93. !     int cur_group;
  94. !     long value;
  95.       register group_header *gh;
  96.   
  97.       for (;;) {
  98. ***************
  99. *** 190,196 ****
  100.   "MASTER")) {
  101.   
  102.        case 'G':
  103. !         cur_group = get_entry("Group number",
  104.                     0L, (long)(master.number_of_groups - 1));
  105.           if (cur_group >= 0)
  106.           dump_m_entry(&active_groups[cur_group]);
  107. --- 194,200 ----
  108.   "MASTER")) {
  109.   
  110.        case 'G':
  111. !         cur_group = (int)get_entry("Group number",
  112.                     0L, (long)(master.number_of_groups - 1));
  113.           if (cur_group >= 0)
  114.           dump_m_entry(&active_groups[cur_group]);
  115. ***************
  116. *** 219,227 ****
  117.        case 'O':
  118.           c = get_cmd("r)epeat_delay  e)xpire_level", "OPTION");
  119.           if (c != 'r' && c != 'e') break;
  120. !         value = get_entry("Option value", 1, 10000);
  121.           if (value < 0) break;
  122. !         send_master(c, (long)value, 0L);
  123.           break;
  124.           
  125.        case 'S':
  126. --- 223,231 ----
  127.        case 'O':
  128.           c = get_cmd("r)epeat_delay  e)xpire_level", "OPTION");
  129.           if (c != 'r' && c != 'e') break;
  130. !         value = get_entry("Option value", 1L, 10000L);
  131.           if (value < 0) break;
  132. !         send_master(c, value, 0L);
  133.           break;
  134.           
  135.        case 'S':
  136. ***************
  137. *** 586,596 ****
  138.       article_number        first_article, next_article, this_art;
  139.       int                n, was_digest;
  140.       char            buffer[512];
  141. -     
  142. -     if (init_group(gh) <= 0)
  143. -     printf("cannot access group %s\n", gh->group_name);
  144.   
  145. !     update_group(gh);
  146.       
  147.       if (validate)
  148.       first_article = gh->first_l_article;
  149. --- 590,602 ----
  150.       article_number        first_article, next_article, this_art;
  151.       int                n, was_digest;
  152.       char            buffer[512];
  153.   
  154. !     if (!validate) {
  155. !     if (init_group(gh) <= 0)
  156. !         printf("cannot access group %s\n", gh->group_name);
  157. !     update_group(gh);
  158. !     }
  159.       
  160.       if (validate)
  161.       first_article = gh->first_l_article;
  162. ***************
  163. *** 600,606 ****
  164.                     (long)gh->last_l_article);
  165.   
  166.       if (first_article < 0) first_article = gh->first_l_article;
  167.       ix = open_data_file(gh, 'x', OPEN_READ);
  168.       if (ix == NULL) {
  169.       if (verbose) printf("NO INDEX FILE\n");
  170. --- 606,613 ----
  171.                     (long)gh->last_l_article);
  172.   
  173.       if (first_article < 0) first_article = gh->first_l_article;
  174. !     if (first_article <= 0) first_article = 1;
  175. !     
  176.       ix = open_data_file(gh, 'x', OPEN_READ);
  177.       if (ix == NULL) {
  178.       if (verbose) printf("NO INDEX FILE\n");
  179. ***************
  180. *** 906,911 ****
  181. --- 913,919 ----
  182.       if (init_group(gh) <= 0) continue; /* no directory */
  183.   
  184.       if (verbose) { printf("\r%s: ", gh->group_name); clrline(); }
  185. +     update_group(gh);
  186.       
  187.       if (gh->group_flag & G_BLOCKED) {
  188.           if (verbose) printf("BLOCKED\n");
  189.  
  190. *** /usr/storm/nn6.3.3/answer.c    Fri Jun 30 11:30:41 1989
  191. --- answer.c    Wed Jul  5 17:16:05 1989
  192. ***************
  193. *** 5,13 ****
  194.   
  195.   extern char *temp_file;
  196.   
  197. ! char *news_record    = NULL;
  198. ! char *mail_record    = NULL;
  199.   
  200.   
  201.   #define INCL_MARK_SIZE    10
  202.   
  203. --- 5,18 ----
  204.   
  205.   extern char *temp_file;
  206.   
  207. ! export char *default_distribution = NULL;
  208. ! export char *extra_mail_headers    = NULL;
  209. ! export char *extra_news_headers    = NULL;
  210. ! export char *mail_record    = NULL;
  211. ! export char *news_record    = NULL;
  212.   
  213. + export int nn_re_style        = 0;    /* use Re^n: in replies */
  214. + export int include_art_id    = 0;
  215.   
  216.   #define INCL_MARK_SIZE    10
  217.   
  218. ***************
  219. *** 97,104 ****
  220.       
  221.       ng_line(t);
  222.       ref_line(t);
  223. !     end_header(t);
  224.   
  225.       if (incl) {
  226.           fprintf(t, "In %s you write:\n", current_group->group_name);
  227. --- 102,109 ----
  228.       
  229.       ng_line(t);
  230.       ref_line(t);
  231. !     
  232. !     end_header(t, extra_mail_headers);
  233.   
  234.       if (incl) {
  235.           fprintf(t, "In %s you write:\n", current_group->group_name);
  236. ***************
  237. *** 135,145 ****
  238.       }
  239.   
  240.       ref_line(t);
  241. !     end_header(t);
  242.   
  243.       if (incl) {
  244.           if (news.ng_from) {
  245.           fprintf(t, "%s writes:\n", news.ng_from);
  246.           ed_line++;
  247.           } else
  248. --- 140,154 ----
  249.       }
  250.   
  251.       ref_line(t);
  252. !     
  253. !     end_header(t, extra_news_headers);
  254.   
  255.       if (incl) {
  256.           if (news.ng_from) {
  257. +         if (include_art_id && news.ng_ident)
  258. +             fprintf(t, "In %s %s ", 
  259. +                 ah->flag & A_DIGEST ? "digest" : "article",
  260. +                 news.ng_ident);
  261.           fprintf(t, "%s writes:\n", news.ng_from);
  262.           ed_line++;
  263.           } else
  264. ***************
  265. *** 179,185 ****
  266.   
  267.       subj_line(t, -1, str, (char *)NULL);
  268.   
  269. !     end_header(t);
  270.      
  271.       if (incl) {
  272.           prompt("\1Edit\1 forwarded message? ");
  273. --- 188,194 ----
  274.   
  275.       subj_line(t, -1, str, (char *)NULL);
  276.   
  277. !     end_header(t, extra_mail_headers);
  278.      
  279.       if (incl) {
  280.           prompt("\1Edit\1 forwarded message? ");
  281. ***************
  282. *** 325,332 ****
  283.       if (str == NULL) return 0;
  284.       strcpy(keywords, str);
  285.       
  286. !     strcpy(distribution, group_name);
  287. !     if (str = strchr(distribution, '.')) *str = NUL;
  288.       
  289.       prompt("\1Distribution\1 (default '%s') ", distribution);
  290.       str = get_s(NONE, NONE, NONE, NO_COMPLETION);
  291. --- 334,345 ----
  292.       if (str == NULL) return 0;
  293.       strcpy(keywords, str);
  294.       
  295. !     if (default_distribution != NULL)
  296. !     strcpy(distribution, default_distribution);
  297. !     else {
  298. !     strcpy(distribution, group_name);
  299. !     if (str = strchr(distribution, '.')) *str = NUL;
  300. !     }
  301.       
  302.       prompt("\1Distribution\1 (default '%s') ", distribution);
  303.       str = get_s(NONE, NONE, NONE, NO_COMPLETION);
  304. ***************
  305. *** 348,354 ****
  306.       fprintf(t, "Keywords: %s\n", keywords);
  307.       ed_line++;
  308.       }
  309. !     fputc(NL, t);
  310.       fputc(NL, t);
  311.   
  312.       fclose(t);
  313. --- 361,368 ----
  314.       fprintf(t, "Keywords: %s\n", keywords);
  315.       ed_line++;
  316.       }
  317. !     end_header(t, extra_news_headers);
  318.       fputc(NL, t);
  319.   
  320.       fclose(t);
  321. ***************
  322. *** 367,373 ****
  323.       
  324.       fputs("Subject: ", t);
  325.   
  326. !     if (re == 0) 
  327.       fputs("Re: ", t);
  328.       else if (re > 0)
  329.       fprintf(t, "Re^%d: ", re + 1);
  330. --- 381,387 ----
  331.       
  332.       fputs("Subject: ", t);
  333.   
  334. !     if (re == 0 || !nn_re_style) 
  335.       fputs("Re: ", t);
  336.       else if (re > 0)
  337.       fprintf(t, "Re^%d: ", re + 1);
  338. ***************
  339. *** 427,435 ****
  340.       ed_line++;
  341.   }
  342.   
  343. ! static end_header(t)
  344.   FILE *t;
  345.   {
  346.       fputc(NL, t);
  347.       ed_line++;
  348.   }
  349. --- 441,463 ----
  350.       ed_line++;
  351.   }
  352.   
  353. ! static end_header(t, extra_headers)
  354.   FILE *t;
  355. + register char *extra_headers;
  356.   {
  357. +     if (extra_headers != NULL && *extra_headers != NUL) {
  358. +     while (*extra_headers != NUL) {
  359. +         if (*extra_headers == ';') {
  360. +         if (*++extra_headers == NUL) break;
  361. +         fputc(NL, t);
  362. +         ed_line++;
  363. +         } else
  364. +         fputc(*extra_headers++, t);
  365. +     }
  366. +     fputc(NL, t);
  367. +     ed_line++;
  368. +     }
  369. +     
  370.       fputc(NL, t);
  371.       ed_line++;
  372.   }
  373.  
  374. *** /usr/storm/nn6.3.0/articles.c    Thu Jun  1 11:10:41 1989
  375. --- articles.c    Sat Jul  8 17:10:23 1989
  376. ***************
  377. *** 29,39 ****
  378.   static thunk *current_str_t = &dummy_str_t;
  379.   static thunk *first_art_t = &dummy_art_t;
  380.   static thunk *current_art_t = &dummy_art_t;
  381. ! static int   cur_str_size = 0, cur_art_size = 0;
  382.   static char *next_str;
  383.   static article_header *next_art, **art_array;
  384.   
  385. ! static unsigned max_articles = 0, mem_offset = 0;
  386.   
  387.   /*
  388.    * allocate one article header
  389. --- 29,39 ----
  390.   static thunk *current_str_t = &dummy_str_t;
  391.   static thunk *first_art_t = &dummy_art_t;
  392.   static thunk *current_art_t = &dummy_art_t;
  393. ! static long  cur_str_size = 0, cur_art_size = 0;
  394.   static char *next_str;
  395.   static article_header *next_art, **art_array;
  396.   
  397. ! static article_number max_articles = 0, mem_offset = 0;
  398.   
  399.   /*
  400.    * allocate one article header
  401. ***************
  402. *** 54,60 ****
  403.       mem_check(ptr, (int)size, chk_msg);
  404.       
  405.       new = (thunk *)calloc(1, sizeof(thunk));
  406. !     mem_check(new, sizeof(thunk), "memory thunk");
  407.       
  408.       new->next_thunk = t->next_thunk;
  409.       t->next_thunk = new;
  410. --- 54,60 ----
  411.       mem_check(ptr, (int)size, chk_msg);
  412.       
  413.       new = (thunk *)calloc(1, sizeof(thunk));
  414. !     mem_check((char *)new, sizeof(thunk), "memory thunk");
  415.       
  416.       new->next_thunk = t->next_thunk;
  417.       t->next_thunk = new;
  418. ***************
  419. *** 99,105 ****
  420.       if (current_str_t->next_thunk == NULL)
  421.           new_thunk(current_str_t, 
  422.                 malloc(STR_THUNK_SIZE),
  423. !               STR_THUNK_SIZE,
  424.                 "string bytes");
  425.   
  426.       current_str_t = current_str_t->next_thunk;
  427. --- 99,105 ----
  428.       if (current_str_t->next_thunk == NULL)
  429.           new_thunk(current_str_t, 
  430.                 malloc(STR_THUNK_SIZE),
  431. !               (long)STR_THUNK_SIZE,
  432.                 "string bytes");
  433.   
  434.       current_str_t = current_str_t->next_thunk;
  435. ***************
  436. *** 226,232 ****
  437.       }
  438.       art_array = (article_header **)
  439.           calloc(max_articles, sizeof(article_header **));
  440. !     mem_check(art_array, (int)max_articles, "article headers");
  441.       while (--n >= 0) art_array[n] = *--articles;
  442.       articles = art_array + mem_offset;
  443.       }
  444. --- 226,232 ----
  445.       }
  446.       art_array = (article_header **)
  447.           calloc(max_articles, sizeof(article_header **));
  448. !     mem_check((char *)art_array, (int)max_articles, "article headers");
  449.       while (--n >= 0) art_array[n] = *--articles;
  450.       articles = art_array + mem_offset;
  451.       }
  452. ***************
  453. *** 322,328 ****
  454.       
  455.       if (n_articles <= 1) return;
  456.   
  457. !     qsort(articles, n_articles, sizeof(article_header *), article_comp);
  458.       
  459.       for (n = n_articles - 1, app = articles + 1; --n >= 0; app++)
  460.       if (article_equal(app, app - 1)) (**app).flag |= A_SAME;
  461. --- 322,328 ----
  462.       
  463.       if (n_articles <= 1) return;
  464.   
  465. !     qsort((char *)articles, (int)n_articles, sizeof(article_header *), article_comp);
  466.       
  467.       for (n = n_articles - 1, app = articles + 1; --n >= 0; app++)
  468.       if (article_equal(app, app - 1)) (**app).flag |= A_SAME;
  469. ***************
  470. *** 332,343 ****
  471.   static offset_cmp(a, b)
  472.   article_header **a, **b;
  473.   {
  474. !     register i;
  475.       
  476. !     if (i = (int)((*a)->a_number - (*b)->a_number))
  477. !     return i;
  478. !     
  479. !     return (int)((*a)->fpos - (*b)->fpos);
  480.   }
  481.   
  482.   static age_cmp(ah1, ah2)
  483. --- 332,343 ----
  484.   static offset_cmp(a, b)
  485.   article_header **a, **b;
  486.   {
  487. !     register long i;
  488.       
  489. !     if ((i = (int)((*a)->a_number - (*b)->a_number)) == 0)
  490. !     i = (*a)->fpos - (*b)->fpos;
  491. !     return (i > 0) ? 1 : (i < 0) ? -1 : 0;
  492.   }
  493.   
  494.   static age_cmp(ah1, ah2)
  495. ***************
  496. *** 351,363 ****
  497.   
  498.   unsort_articles(arrival)
  499.   {
  500. !     register int i;
  501.       
  502.       for (i = n_articles; --i >= 0;)
  503.       articles[i]->flag &= ~A_SAME;
  504.       
  505.       if (n_articles <= 1) return;
  506. !     qsort(articles, n_articles, sizeof(article_header *), 
  507.         arrival ? offset_cmp : age_cmp);
  508.   }
  509.   
  510. --- 351,412 ----
  511.   
  512.   unsort_articles(arrival)
  513.   {
  514. !     register article_number i;
  515.       
  516.       for (i = n_articles; --i >= 0;)
  517.       articles[i]->flag &= ~A_SAME;
  518.       
  519.       if (n_articles <= 1) return;
  520. !     qsort((char *)articles, (int)n_articles, sizeof(article_header *), 
  521.         arrival ? offset_cmp : age_cmp);
  522.   }
  523.   
  524. + /*
  525. +  * Eliminate articles with the A_KILL flag set preserving the present ordering.
  526. +  * This will only release the last entries in the articles array.
  527. +  * Neither strings nor articles headers are released.
  528. +  */
  529. + elim_articles(list, list_lgt)
  530. + register article_number *list;
  531. + int list_lgt;
  532. + {
  533. +     register article_header **srca, **desta;
  534. +     register article_number n, count;
  535. +     int changed, llen;
  536. +     
  537. +     count = 0;
  538. +     changed = 0, llen = 0;
  539. +     for (n = 0, srca = desta = articles; n < n_articles; n++, srca++) {
  540. +     if ((*srca)->flag & A_KILL) {
  541. +         if (list_lgt > 0) {
  542. +         if (n < *list) {
  543. +             if (llen) changed = 1;
  544. +         } else
  545. +         if (n == *list) {
  546. +             if (llen) {
  547. +             llen++;
  548. +             list_lgt--;
  549. +             *list++ = -1;
  550. +             } else
  551. +             ++(*list);
  552. +             changed = 1;
  553. +         }
  554. +         }
  555. +         continue;
  556. +     }
  557. +     if (list_lgt > 0 && n == *list) {
  558. +         *list++ = count;
  559. +         list_lgt--;
  560. +         llen++;
  561. +     }
  562. +     count++;
  563. +     *desta++ = *srca;
  564. +     }
  565. +     if (list_lgt > 0) {
  566. +     if (!llen) *list = 0;
  567. +     changed = 1;
  568. +     }
  569. +     n_articles = count;
  570. +     return changed;
  571. + }
  572.  
  573. *** /usr/storm/nn6.3.3/collect.c    Fri Jun 30 11:30:42 1989
  574. --- collect.c    Tue Jul  4 18:21:16 1989
  575. ***************
  576. *** 13,22 ****
  577.    *    On entry, init_group has been called to setup the proper environment
  578.    */
  579.   
  580. ! collect_group(gh)
  581.   register group_header *gh;
  582.   {
  583. !     int article_count, temp;
  584.       article_number start_collect;
  585.       
  586.       if (gh->last_l_article == 0) {
  587. --- 13,22 ----
  588.    *    On entry, init_group has been called to setup the proper environment
  589.    */
  590.   
  591. ! long collect_group(gh)
  592.   register group_header *gh;
  593.   {
  594. !     long article_count, temp;
  595.       article_number start_collect;
  596.       
  597.       if (gh->last_l_article == 0) {
  598.  
  599. *** /usr/storm/nn6.3.3/data.h    Fri Jun 30 11:30:43 1989
  600. --- data.h    Sat Jul  8 16:21:38 1989
  601. ***************
  602. *** 36,43 ****
  603.   
  604.       int32        group_flag;
  605.   
  606. ! #    define MF(n)    (1<<(n-1))
  607. ! #    define CF(n)    (1<<(n+15))
  608.   
  609.   #    define G_MASTER_FLAGS    (MF(17)-1) /* flags that are saved on file */
  610.   
  611. --- 36,43 ----
  612.   
  613.       int32        group_flag;
  614.   
  615. ! #    define MF(n)    (((int32)1)<<(n-1))
  616. ! #    define CF(n)    (((int32)1)<<(n+15))
  617.   
  618.   #    define G_MASTER_FLAGS    (MF(17)-1) /* flags that are saved on file */
  619.   
  620. ***************
  621. *** 122,128 ****
  622.       
  623.       int32    flag;        /* flags:             */
  624.   
  625. ! #    define AF(n) (1<<(n-1))
  626.   
  627.   #    define A_SELECT       AF(1)    /* article has been selected    */
  628.   #    define A_SAME            AF(2)    /* same subject as prev. article */
  629. --- 122,128 ----
  630.       
  631.       int32    flag;        /* flags:             */
  632.   
  633. ! #    define AF(n) (((int32)1)<<(n-1))
  634.   
  635.   #    define A_SELECT       AF(1)    /* article has been selected    */
  636.   #    define A_SAME            AF(2)    /* same subject as prev. article */
  637. ***************
  638. *** 132,137 ****
  639. --- 132,142 ----
  640.   #    define A_FOLDER        AF(6)    /* article file = "folder_path"    */
  641.   #    define A_CANCEL        AF(7)    /* folder entry cancelled    */
  642.   #    define A_SEEN        AF(8)    /* article presented on menu    */
  643. + #    define A_KILL        AF(9)    /* eliminate article        */
  644. + #    define A_AUTO        AF(10)    /* article was auto selected    */
  645. + #    define A_READ        AF(11)    /* article has been read    */
  646. + #    define A_LEAVE        AF(12)    /* marked for later activity    */
  647. + #    define A_LEAVE_NEXT    AF(13)    /* marked for next invokation    */
  648.   
  649.   #    define A_ST_FILED    AF(16)    /* articles is saved        */
  650.   #    define A_ST_REPLY    AF(17)    /* sent reply to article    */
  651.  
  652. *** /usr/storm/nn6.3.0/db.c    Thu Jun  1 11:10:42 1989
  653. --- db.c    Wed Jul  5 15:36:56 1989
  654. ***************
  655. *** 29,36 ****
  656.       
  657.       current_group = gh;
  658.   
  659. -     if (gh->group_flag & G_NO_DIRECTORY) return 0;
  660.       if (gh->group_flag & G_FOLDER) {
  661.       group_position = NULL;
  662.       group_file_name = NULL;
  663. --- 29,34 ----
  664. ***************
  665. *** 47,52 ****
  666. --- 45,51 ----
  667.       if (is_master) 
  668.           group_position = group_path_name;
  669.       else {
  670. +         if (gh->group_flag & G_NO_DIRECTORY) return 0;
  671.           strcpy(group_path_name, news_directory);
  672.           group_position = group_path_name + strlen(group_path_name);
  673.           *group_position++ = '/';
  674. ***************
  675. *** 109,115 ****
  676.   open_master(mode)
  677.   {
  678.       FILE             *g;
  679. !     int             entries, n, cur_group;
  680.       char             *strings;
  681.       register group_header     *gh;
  682.       static int             first_open = 1;
  683. --- 108,115 ----
  684.   open_master(mode)
  685.   {
  686.       FILE             *g;
  687. !     int             n, cur_group;
  688. !     unsigned            entries;
  689.       char             *strings;
  690.       register group_header     *gh;
  691.       static int             first_open = 1;
  692. ***************
  693. *** 133,141 ****
  694.       
  695.       sorted_groups = (group_header **) 
  696.       calloc(entries, sizeof(group_header *));
  697. !     mem_check(sorted_groups, entries, "sorted group header pointers");
  698.   
  699. !     strings = malloc((int)master.next_group_write_offset);
  700.       mem_check(strings, (int)master.next_group_write_offset, 
  701.             "bytes for group names");
  702.   
  703. --- 133,141 ----
  704.       
  705.       sorted_groups = (group_header **) 
  706.       calloc(entries, sizeof(group_header *));
  707. !     mem_check((char *)sorted_groups, entries, "sorted group header pointers");
  708.   
  709. !     strings = malloc((unsigned)master.next_group_write_offset);
  710.       mem_check(strings, (int)master.next_group_write_offset, 
  711.             "bytes for group names");
  712.   
  713. ***************
  714. *** 177,183 ****
  715.   update_group(gh)
  716.   group_header *gh;
  717.   {
  718. !     int flag;
  719.   
  720.       flag = gh->group_flag & ~G_MASTER_FLAGS;
  721.   
  722. --- 177,183 ----
  723.   update_group(gh)
  724.   group_header *gh;
  725.   {
  726. !     int32 flag;
  727.   
  728.       flag = gh->group_flag & ~G_MASTER_FLAGS;
  729.   
  730. ***************
  731. *** 200,206 ****
  732.   
  733.   sort_groups()
  734.   {
  735. !     qsort(sorted_groups, master.number_of_groups,
  736.         sizeof(group_header *), group_name_cmp);
  737.   }
  738.   
  739. --- 200,206 ----
  740.   
  741.   sort_groups()
  742.   {
  743. !     qsort((char *)sorted_groups, (unsigned)master.number_of_groups,
  744.         sizeof(group_header *), group_name_cmp);
  745.   }
  746.   
  747. ***************
  748. *** 331,337 ****
  749.       if (fwrite(buf, sizeof(net_long), MASTER_FIELDS, f) != MASTER_FIELDS) return 0;
  750.   #else
  751.   
  752. !     if (fwrite(masterp, sizeof(master_header), 1, f) != 1) return 0;
  753.   #endif
  754.       return 1;
  755.   }
  756. --- 331,337 ----
  757.       if (fwrite(buf, sizeof(net_long), MASTER_FIELDS, f) != MASTER_FIELDS) return 0;
  758.   #else
  759.   
  760. !     if (fwrite((char *)masterp, sizeof(master_header), 1, f) != 1) return 0;
  761.   #endif
  762.       return 1;
  763.   }
  764. ***************
  765. *** 397,403 ****
  766.       if (n >= 0)
  767.       fseek(f, (off_t)(sizeof(master_header) + SAVED_GROUP_HEADER_SIZE(*gh) * n), 0);
  768.   
  769. !     if (fwrite(gh, SAVED_GROUP_HEADER_SIZE(*gh), 1, f) != 1)
  770.       return 0;
  771.   #endif
  772.   
  773. --- 397,403 ----
  774.       if (n >= 0)
  775.       fseek(f, (off_t)(sizeof(master_header) + SAVED_GROUP_HEADER_SIZE(*gh) * n), 0);
  776.   
  777. !     if (fwrite((char *)gh, SAVED_GROUP_HEADER_SIZE(*gh), 1, f) != 1)
  778.       return 0;
  779.   #endif
  780.   
  781. ***************
  782. *** 432,438 ****
  783.       if (offset) *offset += ARTICLE_FIELDS * sizeof(net_long);
  784.   #else
  785.       
  786. !     if (fread(dh, sizeof(data_header), 1, f) != 1) return 0;
  787.       if (offset) *offset += sizeof(data_header);
  788.   #endif
  789.       return 1;
  790. --- 432,438 ----
  791.       if (offset) *offset += ARTICLE_FIELDS * sizeof(net_long);
  792.   #else
  793.       
  794. !     if (fread((char *)dh, sizeof(data_header), 1, f) != 1) return 0;
  795.       if (offset) *offset += sizeof(data_header);
  796.   #endif
  797.       return 1;
  798. ***************
  799. *** 462,468 ****
  800.       return 0;
  801.   #else
  802.       
  803. !     if (fwrite(dh, sizeof(data_header), 1, f) != 1) return 0;
  804.   
  805.   #endif
  806.   
  807. --- 462,468 ----
  808.       return 0;
  809.   #else
  810.       
  811. !     if (fwrite((char *)dh, sizeof(data_header), 1, f) != 1) return 0;
  812.   
  813.   #endif
  814.   
  815.  
  816. *** /usr/storm/nn6.3.0/execute.c    Thu Jun  1 11:10:42 1989
  817. --- execute.c    Wed Jul  5 16:52:17 1989
  818. ***************
  819. *** 18,24 ****
  820.       sig_type  (*quit)(), (*intr)(), (*cont)();
  821.       extern int errno;
  822.       
  823. !     was_raw = no_raw();
  824.       
  825.       while ((pid = fork()) == -1) sleep(1);
  826.       
  827. --- 18,24 ----
  828.       sig_type  (*quit)(), (*intr)(), (*cont)();
  829.       extern int errno;
  830.       
  831. !     was_raw = unset_raw();
  832.       
  833.       while ((pid = fork()) == -1) sleep(1);
  834.       
  835. ***************
  836. *** 121,127 ****
  837.   {
  838.       int was_raw;
  839.       
  840. !     was_raw = no_raw();
  841.       gotoxy(0, Lines-1);
  842.       clrline();
  843.   
  844. --- 121,127 ----
  845.   {
  846.       int was_raw;
  847.       
  848. !     was_raw = unset_raw();
  849.       gotoxy(0, Lines-1);
  850.       clrline();
  851.   
  852.  
  853. *** /usr/storm/nn6.3.0/expire.c    Thu Jun  1 11:10:42 1989
  854. --- expire.c    Tue Jul  4 18:21:15 1989
  855. ***************
  856. *** 15,21 ****
  857.       goto error_handler; \
  858.   }
  859.   
  860. ! expire_group(gh)
  861.   register group_header *gh;
  862.   {
  863.       FILE *old_x, *old_d;
  864. --- 15,21 ----
  865.       goto error_handler; \
  866.   }
  867.   
  868. ! long expire_group(gh)
  869.   register group_header *gh;
  870.   {
  871.       FILE *old_x, *old_d;
  872.  
  873. *** /usr/storm/nn6.3.2/folder.c    Wed Jun 28 20:07:46 1989
  874. --- folder.c    Tue Jul  4 18:11:08 1989
  875. ***************
  876. *** 320,326 ****
  877.       }
  878.       closedir(dirp);
  879.       *comp = (char *)0;
  880. !     qsort((char *)completions, comp - completions, sizeof(char *), sort_directory);
  881.       comp_iterator = completions;
  882.       comp_help = completions;
  883.       
  884. --- 320,326 ----
  885.       }
  886.       closedir(dirp);
  887.       *comp = (char *)0;
  888. !     qsort((char *)completions, (unsigned)(comp - completions), sizeof(char *), sort_directory);
  889.       comp_iterator = completions;
  890.       comp_help = completions;
  891.       
  892. ***************
  893. *** 527,533 ****
  894.       register int c;
  895.       register long cnt;
  896.       register article_header *ah, **ahp;
  897. !     register int n;
  898.       
  899.       if ((src = fopen(group_path_name, "r")) == NULL) {
  900.       msg("Cannot open %s", group_path_name);
  901. --- 527,533 ----
  902.       register int c;
  903.       register long cnt;
  904.       register article_header *ah, **ahp;
  905. !     register article_number n;
  906.       
  907.       if ((src = fopen(group_path_name, "r")) == NULL) {
  908.       msg("Cannot open %s", group_path_name);
  909.  
  910. *** /usr/storm/nn6.3.0/global.c    Thu Jun  1 11:10:43 1989
  911. --- global.c    Tue Jul  4 21:02:28 1989
  912. ***************
  913. *** 58,63 ****
  914. --- 58,70 ----
  915.   }
  916.   #endif
  917.   
  918. + /*
  919. +  * who:
  920. +  *    0    nn
  921. +  *    1    nnmaster
  922. +  *    2    nnadmin
  923. +  *    3    nncheck
  924. +  */
  925.   
  926.   init_global(who)
  927.   int who;
  928. ***************
  929. *** 84,90 ****
  930.       if (is_master) {
  931.       signal(SIGINT,  catch_hangup);
  932.       signal(SIGQUIT, catch_hangup);
  933. !     return;
  934.       }
  935.       
  936.       signal(SIGINT,  catch_keyboard);
  937. --- 91,97 ----
  938.       if (is_master) {
  939.       signal(SIGINT,  catch_hangup);
  940.       signal(SIGQUIT, catch_hangup);
  941. !     return 0;
  942.       }
  943.       
  944.       signal(SIGINT,  catch_keyboard);
  945. ***************
  946. *** 98,109 ****
  947.   
  948.       nn_directory = mk_file_name(home_directory, ".nn");
  949.       
  950. !     if (!file_exist(nn_directory, "drwx"))
  951.       mkdir(nn_directory, 0755);    /* should check here */
  952.       if ((env = getenv("TMPDIR")) == NULL) env = TMP_DIRECTORY;
  953.       temp_file = mk_file_name(env, "nn.XXXXXX");    /* dies in ANSI C! */
  954.       mktemp(temp_file);
  955.   }
  956.   
  957.   /*
  958. --- 105,119 ----
  959.   
  960.       nn_directory = mk_file_name(home_directory, ".nn");
  961.       
  962. !     if (who != 2 && !file_exist(nn_directory, "drwx")) {
  963. !     if (who == 3) return -1;
  964.       mkdir(nn_directory, 0755);    /* should check here */
  965. !     }
  966. !     
  967.       if ((env = getenv("TMPDIR")) == NULL) env = TMP_DIRECTORY;
  968.       temp_file = mk_file_name(env, "nn.XXXXXX");    /* dies in ANSI C! */
  969.       mktemp(temp_file);
  970. +     return 0;
  971.   }
  972.   
  973.   /*
  974. ***************
  975. *** 369,381 ****
  976.   log_entry(va_alist)
  977.   va_dcl
  978.   {
  979. !     int type;
  980.       va_list ap;
  981.   
  982.       va_start(ap);
  983.       type = va_arg1(int);
  984. !     enter_log(type, va_args2toN);
  985.       va_end(ap);
  986.   }
  987.   
  988.   #ifdef HAVE_SYSLOG
  989. --- 379,392 ----
  990.   log_entry(va_alist)
  991.   va_dcl
  992.   {
  993. !     int type, rval;
  994.       va_list ap;
  995.   
  996.       va_start(ap);
  997.       type = va_arg1(int);
  998. !     rval = enter_log(type, va_args2toN);
  999.       va_end(ap);
  1000. +     return rval;
  1001.   }
  1002.   
  1003.   #ifdef HAVE_SYSLOG
  1004.  
  1005. *** /usr/storm/nn6.3.3/group.c    Fri Jun 30 11:30:44 1989
  1006. --- group.c    Sat Jul  8 15:05:35 1989
  1007. ***************
  1008. *** 9,15 ****
  1009.   #include "menu.h"
  1010.   #include "keymap.h"
  1011.   #include "regexp.h"
  1012.   
  1013.   export int  dont_split_digests = 0;
  1014.   export int  dont_sort_articles = 0;
  1015. --- 9,17 ----
  1016.   #include "menu.h"
  1017.   #include "keymap.h"
  1018.   #include "regexp.h"
  1019. ! #ifdef HAVE_SYSLOG
  1020. ! #include <syslog.h>
  1021. ! #endif
  1022.   
  1023.   export int  dont_split_digests = 0;
  1024.   export int  dont_sort_articles = 0;
  1025. ***************
  1026. *** 150,156 ****
  1027.       submask++;
  1028.       if (subpattern != NULL) {
  1029.           if (strncmp(submask, subptext, 80) != 0) {
  1030. !         free(subpattern);
  1031.           subpattern = NULL;
  1032.           }
  1033.       }
  1034. --- 152,158 ----
  1035.       submask++;
  1036.       if (subpattern != NULL) {
  1037.           if (strncmp(submask, subptext, 80) != 0) {
  1038. !         free((char *)subpattern);
  1039.           subpattern = NULL;
  1040.           }
  1041.       }
  1042. ***************
  1043. *** 162,168 ****
  1044.       submask = NULL;
  1045.       } else
  1046.       if (subpattern != NULL) {
  1047. !         free(subpattern);
  1048.           subpattern = NULL;
  1049.       }
  1050.       
  1051. --- 164,170 ----
  1052.       submask = NULL;
  1053.       } else
  1054.       if (subpattern != NULL) {
  1055. !         free((char *)subpattern);
  1056.           subpattern = NULL;
  1057.       }
  1058.       
  1059. ***************
  1060. *** 287,293 ****
  1061.       if ((flags & DONT_SORT_ARTICLES) == 0)
  1062.       sort_articles();
  1063.       
  1064. !     return n_articles;
  1065.   }
  1066.   
  1067.   static article_number current_first_article;
  1068. --- 289,295 ----
  1069.       if ((flags & DONT_SORT_ARTICLES) == 0)
  1070.       sort_articles();
  1071.       
  1072. !     return n_articles > 0 ? 1 : 0;
  1073.   }
  1074.   
  1075.   static article_number current_first_article;
  1076. ***************
  1077. *** 402,408 ****
  1078.       if (submask == NULL && !also_read_articles) {
  1079.           if (has_selection(gh, ¤t_first_article, &last_article)) {
  1080.           status = access_group(gh, current_first_article, last_article,
  1081. !                       DONT_SORT_ARTICLES, (char *)NULL, do_kill);
  1082.           do_selections(status >= 0 && n_articles);
  1083.           if (status < 0) goto access_exception;
  1084.           if (n_articles) {
  1085. --- 404,410 ----
  1086.       if (submask == NULL && !also_read_articles) {
  1087.           if (has_selection(gh, ¤t_first_article, &last_article)) {
  1088.           status = access_group(gh, current_first_article, last_article,
  1089. !                       DONT_SORT_ARTICLES, (char *)NULL, 0);
  1090.           do_selections(status >= 0 && n_articles);
  1091.           if (status < 0) goto access_exception;
  1092.           if (n_articles) {
  1093. ***************
  1094. *** 433,443 ****
  1095.    access_exception:
  1096.   
  1097.       if (status < 0) {
  1098. !     if (status == -1)
  1099.           msg("DATABASE CORRUPTED FOR GROUP %s", gh->group_name);
  1100. ! /*    else
  1101. !         msg("Group %s is blocked - try again later", gh->group_name);
  1102. ! */
  1103.       menu_return( ME_NEXT );
  1104.       }
  1105.       
  1106. --- 435,451 ----
  1107.    access_exception:
  1108.   
  1109.       if (status < 0) {
  1110. !     if (status == -1) {
  1111. !         clrdisp();
  1112.           msg("DATABASE CORRUPTED FOR GROUP %s", gh->group_name);
  1113. ! #ifdef HAVE_SYSLOG
  1114. !         openlog("nn", LOG_CONS, LOG_DAEMON);
  1115. !         syslog(LOG_ALERT, "database corrupted for newsgroup %s.",
  1116. !            gh->group_name);
  1117. !         closelog();
  1118. ! #endif
  1119. !         user_delay(5);
  1120. !     }
  1121.       menu_return( ME_NEXT );
  1122.       }
  1123.       
  1124. ***************
  1125. *** 452,462 ****
  1126.   
  1127.       if (menu_cmd == ME_QUIT || menu_cmd == ME_NEXT || menu_cmd == ME_PREV)
  1128.       if (submask == NULL && !no_update) 
  1129. !         save_selection(gh, current_first_article, gh->last_l_article);
  1130.   
  1131.       if (menu_cmd == ME_READ || menu_cmd == ME_NO_ARTICLES) {
  1132.       if (did_selection) {
  1133. !         int was_read = gh->group_flag & G_READ;
  1134.   
  1135.           prev_last = gh->last_l_article;
  1136.           gh->last_l_article = last_article;
  1137. --- 460,470 ----
  1138.   
  1139.       if (menu_cmd == ME_QUIT || menu_cmd == ME_NEXT || menu_cmd == ME_PREV)
  1140.       if (submask == NULL && !no_update) 
  1141. !         save_selection(gh, current_first_article, gh->last_l_article, 0);
  1142.   
  1143.       if (menu_cmd == ME_READ || menu_cmd == ME_NO_ARTICLES) {
  1144.       if (did_selection) {
  1145. !         int32 was_read = gh->group_flag & G_READ;
  1146.   
  1147.           prev_last = gh->last_l_article;
  1148.           gh->last_l_article = last_article;
  1149. ***************
  1150. *** 855,861 ****
  1151.       
  1152.       printf("\r%s", cur->group_name); clrline();
  1153.       
  1154. !     access_group(cur, -1, cur->last_l_article, access_mode, submask, do_kill);
  1155.       }
  1156.       merge_memory();
  1157.       if (n_articles == 0) return;
  1158. --- 863,869 ----
  1159.       
  1160.       printf("\r%s", cur->group_name); clrline();
  1161.       
  1162. !     access_group(cur, (article_number)(-1), cur->last_l_article, access_mode, submask, do_kill);
  1163.       }
  1164.       merge_memory();
  1165.       if (n_articles == 0) return;
  1166.  
  1167. *** /usr/storm/nn6.3.0/help.more    Thu Jun  1 11:10:43 1989
  1168. --- help.more    Fri Jul  7 11:06:17 1989
  1169. ***************
  1170. *** 7,14 ****
  1171.                           c       compress spaces
  1172.   ;:AGOTO ANOTHER ARTICLE;:A
  1173.   SP      next (at end of current article)    ;:ACANCEL, SUBSCRIBE, KILL;:A
  1174. ! n       next                                C       cancel article
  1175. ! p       previous article                    U       (un)subscribe to group
  1176.   k       kill subject (not permanently)      K       kill/select handling
  1177.   *       select subject                  
  1178.                                                   ;:AQUIT / ESCAPE;:A
  1179. --- 7,14 ----
  1180.                           c       compress spaces
  1181.   ;:AGOTO ANOTHER ARTICLE;:A
  1182.   SP      next (at end of current article)    ;:ACANCEL, SUBSCRIBE, KILL;:A
  1183. ! n, p    next/previous article               C       cancel article
  1184. ! l       mark article for later action       U       (un)subscribe to group
  1185.   k       kill subject (not permanently)      K       kill/select handling
  1186.   *       select subject                  
  1187.                                                   ;:AQUIT / ESCAPE;:A
  1188.  
  1189. *** /usr/storm/nn6.3.2/init.c    Wed Jun 28 20:07:51 1989
  1190. --- init.c    Sat Jul  8 00:04:11 1989
  1191. ***************
  1192. *** 581,586 ****
  1193. --- 581,587 ----
  1194.           
  1195.           clrdisp();
  1196.           rm_kill_file();
  1197. +         free_kill_entries();
  1198.           do_kill_handling = init_kill() && do_kill_handling;
  1199.           return AC_REDRAW;
  1200.       }
  1201. ***************
  1202. *** 646,652 ****
  1203.       }
  1204.       
  1205.       CASE( "coredump" ) {
  1206. !         no_raw();
  1207.           abort();
  1208.       }
  1209.   
  1210. --- 647,653 ----
  1211.       }
  1212.       
  1213.       CASE( "coredump" ) {
  1214. !         unset_raw();
  1215.           abort();
  1216.       }
  1217.   
  1218.  
  1219. *** /usr/storm/nn6.3.3/keymap.c    Fri Jun 30 11:30:46 1989
  1220. --- keymap.c    Tue Jul  4 19:58:05 1989
  1221. ***************
  1222. *** 317,323 ****
  1223.   /* :   */        K_EXTENDED_CMD,
  1224.   /* ;   */    K_UNBOUND, 
  1225.   /* <   */        K_PREV_PAGE,
  1226. ! /* =   */    K_UNBOUND, 
  1227.   /* >   */        K_NEXT_PAGE,
  1228.   /* ?   */        K_HELP,
  1229.   /* @   */        K_SELECT_INVERT,
  1230. --- 317,323 ----
  1231.   /* :   */        K_EXTENDED_CMD,
  1232.   /* ;   */    K_UNBOUND, 
  1233.   /* <   */        K_PREV_PAGE,
  1234. ! /* =   */        K_GOTO_MATCH, 
  1235.   /* >   */        K_NEXT_PAGE,
  1236.   /* ?   */        K_HELP,
  1237.   /* @   */        K_SELECT_INVERT,
  1238. ***************
  1239. *** 422,428 ****
  1240.   
  1241.       "decode",            K_UUDECODE,        0,
  1242.   
  1243. !     "find",            K_GOTO_MATCH,        K_ONLY_MORE,
  1244.       "find-next",        K_NEXT_MATCH,        K_ONLY_MORE,
  1245.       "follow",            K_FOLLOW_UP,        0,
  1246.       "full-digest",        K_FULL_DIGEST,        K_ONLY_MORE,
  1247. --- 422,428 ----
  1248.   
  1249.       "decode",            K_UUDECODE,        0,
  1250.   
  1251. !     "find",            K_GOTO_MATCH,        0,
  1252.       "find-next",        K_NEXT_MATCH,        K_ONLY_MORE,
  1253.       "follow",            K_FOLLOW_UP,        0,
  1254.       "full-digest",        K_FULL_DIGEST,        K_ONLY_MORE,
  1255.  
  1256. *** /usr/storm/nn6.3.3/keymap.h    Fri Jun 30 11:30:47 1989
  1257. --- keymap.h    Thu Jul  6 15:04:13 1989
  1258. ***************
  1259. *** 97,115 ****
  1260.   #define    K_MACRO            0x0100 /* call macro            */
  1261.   #define    K_ARTICLE_ID        0x0200 /* article id in lower part    */
  1262.   
  1263. - /* special keys returned by get_c() */
  1264. - #define    K_interrupt    CTRL('G')
  1265. - #define    K_up_arrow    0x0081
  1266. - #define    K_down_arrow    0x0082
  1267. - #define K_left_arrow    0x0083
  1268. - #define K_right_arrow    0x0084
  1269. - #define    K_function(n)    (0x0085 + n)
  1270. - #define    GETC_COMMAND    0x4000    /* bit set by get_c to return a command */
  1271.   
  1272.   /*
  1273.    * KEY MAP SIZE is:
  1274. --- 97,102 ----
  1275.  
  1276. *** /usr/storm/nn6.3.3/kill.c    Fri Jun 30 11:30:48 1989
  1277. --- kill.c    Sat Jul  8 00:56:04 1989
  1278. ***************
  1279. *** 11,22 ****
  1280.   
  1281.   extern char *quick_match();
  1282.   
  1283. ! #define COMP_KILL_MAGIC    0x4b694c6c    /* KiLl */
  1284.   
  1285.   /*
  1286.    * kill flags
  1287.    */
  1288.   
  1289.   #define    AUTO_KILL    0x01
  1290.   #define AUTO_SELECT    0x00    /* pseudo flag */
  1291.   #define ON_SUBJECT    0x02
  1292. --- 11,24 ----
  1293.   
  1294.   extern char *quick_match();
  1295.   
  1296. ! #define COMP_KILL_MAGIC    0x4b694c6d    /* KiLm */
  1297.   
  1298.   /*
  1299.    * kill flags
  1300.    */
  1301.   
  1302. + #define COMP_KILL_ENTRY    0x80
  1303.   #define    AUTO_KILL    0x01
  1304.   #define AUTO_SELECT    0x00    /* pseudo flag */
  1305.   #define ON_SUBJECT    0x02
  1306. ***************
  1307. *** 52,67 ****
  1308.   typedef struct kill_list_entry {
  1309.       int kill_flag;
  1310.       char *kill_pattern;
  1311.       struct kill_list_entry *next_kill;
  1312.   } kill_list_entry;
  1313.   
  1314.   
  1315.   static kill_list_entry dummy_kill = {
  1316. !     0, (char *)NULL, (kill_list_entry *)NULL 
  1317.   };
  1318.   static kill_list_entry *global_kill_list = &dummy_kill;
  1319.   static kill_list_entry *end_kill_list = &dummy_kill;
  1320.   
  1321.   kill_article(ah)
  1322.   article_header *ah;
  1323. --- 54,72 ----
  1324.   typedef struct kill_list_entry {
  1325.       int kill_flag;
  1326.       char *kill_pattern;
  1327. +     regexp *kill_regexp;
  1328.       struct kill_list_entry *next_kill;
  1329.   } kill_list_entry;
  1330.   
  1331. + static kill_list_entry *kill_tab;
  1332. + static char *kill_patterns;
  1333.   
  1334.   static kill_list_entry dummy_kill = {
  1335. !     0, (char *)NULL, (regexp *)NULL, (kill_list_entry *)NULL 
  1336.   };
  1337.   static kill_list_entry *global_kill_list = &dummy_kill;
  1338.   static kill_list_entry *end_kill_list = &dummy_kill;
  1339. ! static kill_list_entry latest_kl_entry;
  1340.   
  1341.   kill_article(ah)
  1342.   article_header *ah;
  1343. ***************
  1344. *** 83,89 ****
  1345.           continue;
  1346.       } else
  1347.       if (kl->kill_flag & KILL_ON_REGEXP) {
  1348. !         if (regexec((regexp *)(kl->kill_pattern), string) == 0)
  1349.           continue;
  1350.       } else
  1351.           if (quick_match(string, kl->kill_pattern) == NULL)
  1352. --- 88,94 ----
  1353.           continue;
  1354.       } else
  1355.       if (kl->kill_flag & KILL_ON_REGEXP) {
  1356. !         if (regexec(kl->kill_regexp, string) == 0)
  1357.           continue;
  1358.       } else
  1359.           if (quick_match(string, kl->kill_pattern) == NULL)
  1360. ***************
  1361. *** 91,98 ****
  1362.       
  1363.       if (kl->kill_flag & AUTO_KILL)
  1364.           return 1;
  1365. !     
  1366. !     ah->flag |= A_SELECT;
  1367.       break;
  1368.       }
  1369.       
  1370. --- 96,103 ----
  1371.       
  1372.       if (kl->kill_flag & AUTO_KILL)
  1373.           return 1;
  1374. !     ah->flag |= A_SELECT | A_AUTO;
  1375.       break;
  1376.       }
  1377.       
  1378. ***************
  1379. *** 100,119 ****
  1380.   }
  1381.   
  1382.   
  1383. ! auto_select_article(ah)
  1384.   article_header *ah;
  1385.   {
  1386.       register kill_list_entry *kl;
  1387.       char *string;
  1388. !     
  1389. !     end_kill_list->next_kill = ah->a_group ?
  1390. !     (kill_list_entry *)(ah->a_group->kill_list) :
  1391. !     (kill_list_entry *)(current_group->kill_list);
  1392.       
  1393. -     kl = global_kill_list;
  1394.       while (kl = kl->next_kill) {
  1395. !     if (kl->kill_flag & AUTO_KILL) continue;
  1396. !     
  1397.       if (kl->kill_flag & ON_SUBJECT)
  1398.           string = ah->subject;
  1399.       else
  1400. --- 105,135 ----
  1401.   }
  1402.   
  1403.   
  1404. ! auto_select_article(ah, do_select)
  1405.   article_header *ah;
  1406. + int do_select;
  1407.   {
  1408.       register kill_list_entry *kl;
  1409. +     kill_list_entry kl_head;
  1410.       char *string;
  1411. !     if (do_select == 2) {
  1412. !     kl = &kl_head;
  1413. !     kl->next_kill = &latest_kl_entry;
  1414. !     } else {
  1415. !     end_kill_list->next_kill = ah->a_group ?
  1416. !         (kill_list_entry *)(ah->a_group->kill_list) :
  1417. !         (kill_list_entry *)(current_group->kill_list);
  1418. !     kl = global_kill_list;
  1419. !     }
  1420.       
  1421.       while (kl = kl->next_kill) {
  1422. !     if (do_select) {
  1423. !         if (kl->kill_flag & AUTO_KILL) continue;
  1424. !     } else {
  1425. !         if ((kl->kill_flag & AUTO_KILL) == 0) continue;
  1426. !     }
  1427. !      check_one:    
  1428.       if (kl->kill_flag & ON_SUBJECT)
  1429.           string = ah->subject;
  1430.       else
  1431. ***************
  1432. *** 124,130 ****
  1433.           continue;
  1434.       } else
  1435.       if (kl->kill_flag & KILL_ON_REGEXP) {
  1436. !         if (regexec((regexp *)(kl->kill_pattern), string) == 0)
  1437.           continue;
  1438.       } else
  1439.           if (quick_match(string, kl->kill_pattern) == NULL)
  1440. --- 140,146 ----
  1441.           continue;
  1442.       } else
  1443.       if (kl->kill_flag & KILL_ON_REGEXP) {
  1444. !         if (regexec(kl->kill_regexp, string) == 0)
  1445.           continue;
  1446.       } else
  1447.           if (quick_match(string, kl->kill_pattern) == NULL)
  1448. ***************
  1449. *** 148,164 ****
  1450.       time_t now;
  1451.       FILE *killf;
  1452.       register kill_list_entry *kl;
  1453.       char *str;
  1454.       
  1455.       if (flag & KILL_ON_REGEXP) {
  1456. !     str = (char *)regcomp(pattern);
  1457. !     if (str == NULL) return;
  1458.       } else {
  1459. !     str = malloc(strlen(pattern) + 1);
  1460. !     mem_check(str, 1, "string");
  1461. !     
  1462. !     strcpy(str, pattern);
  1463. !     
  1464.       if ((flag & KILL_MUST_MATCH) == 0)
  1465.           init_quick_match(str);
  1466.       }
  1467. --- 164,179 ----
  1468.       time_t now;
  1469.       FILE *killf;
  1470.       register kill_list_entry *kl;
  1471. +     regexp *re;
  1472.       char *str;
  1473.       
  1474. +     str = copy_str(pattern);
  1475. +     
  1476.       if (flag & KILL_ON_REGEXP) {
  1477. !     re = regcomp(pattern);
  1478. !     if (re == NULL) return;
  1479.       } else {
  1480. !     re = NULL;
  1481.       if ((flag & KILL_MUST_MATCH) == 0)
  1482.           init_quick_match(str);
  1483.       }
  1484. ***************
  1485. *** 191,200 ****
  1486.       rm_kill_file();
  1487.       
  1488.       kl = (kill_list_entry *)calloc(1, sizeof(kill_list_entry));
  1489. !     mem_check(kl, 1, "kill list entry");
  1490.       
  1491. !     kl->kill_pattern = str;
  1492. !     kl->kill_flag = flag;
  1493.       
  1494.       if (gh) {
  1495.       kl->next_kill = (kill_list_entry *)(gh->kill_list);
  1496. --- 206,217 ----
  1497.       rm_kill_file();
  1498.       
  1499.       kl = (kill_list_entry *)calloc(1, sizeof(kill_list_entry));
  1500. !     mem_check((char *)kl, 1, "kill list entry");
  1501.       
  1502. !     latest_kl_entry.kill_pattern = kl->kill_pattern = str;
  1503. !     latest_kl_entry.kill_regexp = kl->kill_regexp = re;
  1504. !     latest_kl_entry.kill_flag = kl->kill_flag = flag;
  1505. !     latest_kl_entry.next_kill = NULL;
  1506.       
  1507.       if (gh) {
  1508.       kl->next_kill = (kill_list_entry *)(gh->kill_list);
  1509. ***************
  1510. *** 236,242 ****
  1511.        case NL:
  1512.       if (ah == NULL) {
  1513.           ah = get_menu_article();
  1514. !         if (ah == NULL) return;
  1515.       }
  1516.       
  1517.       strcpy(buffer, ah->subject);
  1518. --- 253,259 ----
  1519.        case NL:
  1520.       if (ah == NULL) {
  1521.           ah = get_menu_article();
  1522. !         if (ah == NULL) return -1;
  1523.       }
  1524.       
  1525.       strcpy(buffer, ah->subject);
  1526. ***************
  1527. *** 243,249 ****
  1528.       enter_kill_file(current_group, buffer, 
  1529.               AUTO_KILL | ON_SUBJECT | KILL_MUST_MATCH, 30);
  1530.       msg("DONE");
  1531. !     return;
  1532.       
  1533.        case 'k':
  1534.        case 'K':
  1535. --- 260,266 ----
  1536.       enter_kill_file(current_group, buffer, 
  1537.               AUTO_KILL | ON_SUBJECT | KILL_MUST_MATCH, 30);
  1538.       msg("DONE");
  1539. !     return 1;
  1540.       
  1541.        case 'k':
  1542.        case 'K':
  1543. ***************
  1544. *** 258,264 ****
  1545.       mode1 = "SELECT";
  1546.       break;
  1547.        default:
  1548. !     return;
  1549.       }
  1550.       
  1551.       prompt("\1AUTO %s\1 on (S)ubject or (N)ame ?", mode1);
  1552. --- 275,281 ----
  1553.       mode1 = "SELECT";
  1554.       break;
  1555.        default:
  1556. !     return -1;
  1557.       }
  1558.       
  1559.       prompt("\1AUTO %s\1 on (S)ubject or (N)ame ?", mode1);
  1560. ***************
  1561. *** 281,298 ****
  1562.       mode2 = "Subject";
  1563.       break;
  1564.        default:
  1565. !     return;
  1566.       }
  1567.   
  1568.       prompt("\1%s %s:\1", mode1, mode2);
  1569.       
  1570.       pattern = get_s(dflt, NONE, "%=/", NO_COMPLETION);
  1571. !     if (pattern == NULL) return;
  1572.       if (*pattern == NUL || *pattern == '%' || *pattern == '=') {
  1573.       if (dflt && *dflt)
  1574.           pattern = dflt;
  1575.       else {
  1576. !         if ((ah = get_menu_article()) == NULL) return;
  1577.           pattern = (flag & ON_SUBJECT) ? ah->subject : ah->sender;
  1578.       }
  1579.       flag |= KILL_MUST_MATCH;
  1580. --- 298,315 ----
  1581.       mode2 = "Subject";
  1582.       break;
  1583.        default:
  1584. !     return -1;
  1585.       }
  1586.   
  1587.       prompt("\1%s %s:\1", mode1, mode2);
  1588.       
  1589.       pattern = get_s(dflt, NONE, "%=/", NO_COMPLETION);
  1590. !     if (pattern == NULL) return -1;
  1591.       if (*pattern == NUL || *pattern == '%' || *pattern == '=') {
  1592.       if (dflt && *dflt)
  1593.           pattern = dflt;
  1594.       else {
  1595. !         if ((ah = get_menu_article()) == NULL) return -1;
  1596.           pattern = (flag & ON_SUBJECT) ? ah->subject : ah->sender;
  1597.       }
  1598.       flag |= KILL_MUST_MATCH;
  1599. ***************
  1600. *** 301,307 ****
  1601.           prompt("\1%s %s\1 (regexp): ", mode1, mode2);
  1602.       
  1603.           pattern = get_s(NONE, NONE, NONE, NO_COMPLETION);
  1604. !         if (pattern == NULL || *pattern == NUL) return;
  1605.           flag |= KILL_ON_REGEXP;
  1606.       }
  1607.       
  1608. --- 318,324 ----
  1609.           prompt("\1%s %s\1 (regexp): ", mode1, mode2);
  1610.       
  1611.           pattern = get_s(NONE, NONE, NONE, NO_COMPLETION);
  1612. !         if (pattern == NULL || *pattern == NUL) return -1;
  1613.           flag |= KILL_ON_REGEXP;
  1614.       }
  1615.       
  1616. ***************
  1617. *** 324,335 ****
  1618.        gh = NULL;
  1619.        break;
  1620.         default:
  1621. !      return;
  1622.        }
  1623.   
  1624.       prompt("\1Lifetime of entry in days\1 (P)ermanent ");
  1625.       days_str = get_s(" 30 days", NONE, "pP", NO_COMPLETION);
  1626. !     if (days_str == NULL) return;
  1627.   
  1628.       if (*days_str == NUL) {
  1629.           days_str = "30 days";
  1630. --- 341,352 ----
  1631.        gh = NULL;
  1632.        break;
  1633.         default:
  1634. !      return -1;
  1635.        }
  1636.   
  1637.       prompt("\1Lifetime of entry in days\1 (P)ermanent ");
  1638.       days_str = get_s(" 30 days", NONE, "pP", NO_COMPLETION);
  1639. !     if (days_str == NULL) return -1;
  1640.   
  1641.       if (*days_str == NUL) {
  1642.           days_str = "30 days";
  1643. ***************
  1644. *** 342,348 ****
  1645.       sprintf(days_str, "%d days", days);
  1646.       } else {
  1647.       ding();
  1648. !     return;
  1649.       }
  1650.   
  1651.       prompt("\1CONFIRM\1 %s %s %s%s: %-.35s%s ",
  1652. --- 359,365 ----
  1653.       sprintf(days_str, "%d days", days);
  1654.       } else {
  1655.       ding();
  1656. !     return -1;
  1657.       }
  1658.   
  1659.       prompt("\1CONFIRM\1 %s %s %s%s: %-.35s%s ",
  1660. ***************
  1661. *** 350,358 ****
  1662.          (flag & KILL_MUST_MATCH) ? " exact" : 
  1663.          (flag & KILL_ON_REGEXP) ? " regexp" : "",
  1664.          pattern, strlen(pattern) > 35 ? "..." : "");
  1665. !     if (yes(0) <= 0) return;
  1666.       
  1667.       enter_kill_file(gh, pattern, flag, days);
  1668.   }
  1669.   
  1670.   
  1671. --- 367,377 ----
  1672.          (flag & KILL_MUST_MATCH) ? " exact" : 
  1673.          (flag & KILL_ON_REGEXP) ? " regexp" : "",
  1674.          pattern, strlen(pattern) > 35 ? "..." : "");
  1675. !     if (yes(0) <= 0) return -1;
  1676.       
  1677.       enter_kill_file(gh, pattern, flag, days);
  1678. +     return (flag & AUTO_KILL) ? 1 : 0;
  1679.   }
  1680.   
  1681.   
  1682. ***************
  1683. *** 363,374 ****
  1684.       FILE *killf;
  1685.       comp_kill_header header;
  1686.       comp_kill_entry  entry;
  1687. -     kill_list_entry *kill_tab;
  1688.       register group_header *gh;
  1689.       register kill_list_entry *kl;
  1690. -     char *patterns;
  1691.       time_t kill_age, comp_age;
  1692. !     register n;
  1693.       
  1694.       Loop_Groups_Header(gh)
  1695.       gh->kill_list = NULL;
  1696. --- 382,393 ----
  1697.       FILE *killf;
  1698.       comp_kill_header header;
  1699.       comp_kill_entry  entry;
  1700.       register group_header *gh;
  1701.       register kill_list_entry *kl;
  1702.       time_t kill_age, comp_age;
  1703. !     register long n;
  1704. !     int first_try = 1;
  1705. !     import char *delayed_msg;
  1706.       
  1707.       Loop_Groups_Header(gh)
  1708.       gh->kill_list = NULL;
  1709. ***************
  1710. *** 377,405 ****
  1711.       if (kill_age == 0) return 0;
  1712.       
  1713.       comp_age = file_exist(relative(nn_directory, COMPILED_KILL), "fr");
  1714.       if (comp_age < kill_age && !compile_kill_file()) return 0;
  1715. !     
  1716.       killf = open_file(relative(nn_directory, COMPILED_KILL), OPEN_READ);
  1717.       if (killf == NULL) return 0;
  1718.   
  1719. !     if (fread(&header, sizeof(header), 1, killf) != 1) goto err;
  1720.       if (header.ckh_magic != COMP_KILL_MAGIC) goto err;
  1721.   
  1722. !     patterns = malloc(header.ckh_pattern_size);
  1723. !     mem_check(patterns, header.ckh_pattern_size, "kill bytes");
  1724.       
  1725.       kill_tab = (kill_list_entry *)
  1726. !     calloc(header.ckh_entries, sizeof(kill_list_entry));
  1727. !     mem_check(kill_tab, header.ckh_entries, "kill entries");
  1728. !     
  1729.       for (n = header.ckh_entries, kl = kill_tab; --n >= 0; kl++) {
  1730. !     if (fread(&entry, sizeof(entry), 1, killf) != 1) goto err;
  1731.       
  1732. !     kl->kill_pattern = patterns + entry.ck_pattern_index;
  1733.       kl->kill_flag = entry.ck_flag;
  1734.   
  1735. !     if (kl->kill_flag & KILL_ON_REGEXP) 
  1736. !         kl->kill_pattern = (char *)regcomp(kl->kill_pattern);
  1737.       
  1738.       if (entry.ck_group >= 0) {
  1739.           gh = active_groups + entry.ck_group;
  1740. --- 396,437 ----
  1741.       if (kill_age == 0) return 0;
  1742.       
  1743.       comp_age = file_exist(relative(nn_directory, COMPILED_KILL), "fr");
  1744. +  again:
  1745.       if (comp_age < kill_age && !compile_kill_file()) return 0;
  1746. !     kill_tab = NULL;
  1747. !     kill_patterns = NULL;
  1748. !     
  1749.       killf = open_file(relative(nn_directory, COMPILED_KILL), OPEN_READ);
  1750.       if (killf == NULL) return 0;
  1751.   
  1752. !     if (fread((char *)&header, sizeof(header), 1, killf) != 1) goto err;
  1753.       if (header.ckh_magic != COMP_KILL_MAGIC) goto err;
  1754.   
  1755. !     kill_patterns = malloc((unsigned)header.ckh_pattern_size);
  1756. !     mem_check(kill_patterns, (int)header.ckh_pattern_size, "kill bytes");
  1757.       
  1758.       kill_tab = (kill_list_entry *)
  1759. !     calloc((unsigned)header.ckh_entries, sizeof(kill_list_entry));
  1760. !     mem_check((char *)kill_tab, (int)header.ckh_entries, "kill entries");
  1761. !     fseek(killf, (off_t)(header.ckh_entries * sizeof(entry)), 1);
  1762. !     if (fread(kill_patterns, sizeof(char), (int)header.ckh_pattern_size, killf)
  1763. !     !=  header.ckh_pattern_size) goto err;
  1764. !     fseek(killf, (off_t)sizeof(header), 0);
  1765.       for (n = header.ckh_entries, kl = kill_tab; --n >= 0; kl++) {
  1766. !     if (fread((char *)&entry, sizeof(entry), 1, killf) != 1) goto err;
  1767. !     if (header.ckh_pattern_size <= entry.ck_pattern_index ||
  1768. !         entry.ck_pattern_index < 0) goto err;
  1769.       
  1770. !     kl->kill_pattern = kill_patterns + entry.ck_pattern_index;
  1771.       kl->kill_flag = entry.ck_flag;
  1772.   
  1773. !     if (kl->kill_flag & KILL_ON_REGEXP)
  1774. !         kl->kill_regexp = regcomp(kl->kill_pattern);
  1775. !     else
  1776. !         kl->kill_regexp = NULL;
  1777.       
  1778.       if (entry.ck_group >= 0) {
  1779.           gh = active_groups + entry.ck_group;
  1780. ***************
  1781. *** 412,428 ****
  1782.       }
  1783.       }
  1784.             
  1785. -     if (fread(patterns, sizeof(char), header.ckh_pattern_size, killf)
  1786. -     !=  header.ckh_pattern_size) goto err;
  1787.       fclose(killf);
  1788.       
  1789.       return 1;
  1790.       
  1791.    err:
  1792.       fclose(killf);
  1793. -     msg("Error in compiled kill file");
  1794.       rm_kill_file();
  1795.   
  1796.       Loop_Groups_Header(gh)
  1797.       gh->kill_list = NULL;
  1798. --- 444,466 ----
  1799.       }
  1800.       }
  1801.             
  1802.       fclose(killf);
  1803.       
  1804.       return 1;
  1805.       
  1806.    err:
  1807. +     if (kill_patterns != NULL) free(kill_patterns);
  1808. +     if (kill_tab != NULL) free(kill_tab);
  1809. +     
  1810.       fclose(killf);
  1811.       rm_kill_file();
  1812. +     if (first_try) {
  1813. +     first_try = 0;
  1814. +     comp_age = 0;
  1815. +     goto again;
  1816. +     }
  1817. +     
  1818. +     delayed_msg = "Error in compiled kill file (ignored)";
  1819.   
  1820.       Loop_Groups_Header(gh)
  1821.       gh->kill_list = NULL;
  1822. ***************
  1823. *** 509,515 ****
  1824.       /* flags */
  1825.   
  1826.       cp = np;
  1827. !     flag = 0;
  1828.       
  1829.       for (;;) {
  1830.           switch (*cp++) {
  1831. --- 547,553 ----
  1832.       /* flags */
  1833.   
  1834.       cp = np;
  1835. !     flag = COMP_KILL_ENTRY;
  1836.       
  1837.       for (;;) {
  1838.           switch (*cp++) {
  1839. ***************
  1840. *** 579,585 ****
  1841.   
  1842.       header.ckh_magic = COMP_KILL_MAGIC;
  1843.   
  1844. !     if (fwrite(&header, sizeof(header), 1, compf) != 1)
  1845.       goto err2;
  1846.       
  1847.       fclose(compf);
  1848. --- 617,623 ----
  1849.   
  1850.       header.ckh_magic = COMP_KILL_MAGIC;
  1851.   
  1852. !     if (fwrite((char *)&header, sizeof(header), 1, compf) != 1)
  1853.       goto err2;
  1854.       
  1855.       fclose(compf);
  1856. ***************
  1857. *** 629,634 ****
  1858. --- 667,706 ----
  1859.   }
  1860.   
  1861.   
  1862. + free_kill_entries()
  1863. + {
  1864. +     register group_header *gh;
  1865. +     Loop_Groups_Header(gh)
  1866. +     if (gh->kill_list) {
  1867. +         free_kill_list((kill_list_entry *)(gh->kill_list));
  1868. +         gh->kill_list = NULL;
  1869. +     }
  1870. +     
  1871. +     end_kill_list->next_kill = NULL;
  1872. +     free_kill_list(global_kill_list->next_kill);
  1873. +     end_kill_list = global_kill_list = &dummy_kill;
  1874. +     if (kill_patterns != NULL) free(kill_patterns);
  1875. +     if (kill_tab != NULL) free(kill_tab);
  1876. + }
  1877. + static free_kill_list(kl)
  1878. + register kill_list_entry *kl;
  1879. + {
  1880. +     register kill_list_entry *nxt;
  1881. +     while (kl) {
  1882. +     nxt = kl->next_kill;
  1883. +     if (kl->kill_regexp != NULL) free(kl->kill_regexp);
  1884. +     if ((kl->kill_flag & COMP_KILL_ENTRY) == 0) {
  1885. +         if (kl->kill_pattern != NULL) free(kl->kill_pattern);
  1886. +         free(kl);
  1887. +     }
  1888. +     kl = nxt;
  1889. +     }
  1890. + }
  1891.   dump_kill_list()
  1892.   {
  1893.       register kill_list_entry *kl;
  1894. ***************
  1895. *** 646,654 ****
  1896.   
  1897.       if (pg_next() < 0) goto out;
  1898.       if (pg_next() < 0) goto out;
  1899.       so_printf("\1GROUP %s kill list entries\1", current_group->group_name);
  1900.       
  1901. -     kl = (kill_list_entry *)(current_group->kill_list);
  1902.       while (kl) {
  1903.       if (print_kill(kl) < 0) break;
  1904.       kl = kl->next_kill;
  1905. --- 718,731 ----
  1906.   
  1907.       if (pg_next() < 0) goto out;
  1908.       if (pg_next() < 0) goto out;
  1909. +     kl = (kill_list_entry *)(current_group->kill_list);
  1910. +     if (kl == NULL) {
  1911. +     printf("No kill entries for %s", current_group->group_name);
  1912. +     goto out;
  1913. +     }
  1914.       so_printf("\1GROUP %s kill list entries\1", current_group->group_name);
  1915.       
  1916.       while (kl) {
  1917.       if (print_kill(kl) < 0) break;
  1918.       kl = kl->next_kill;
  1919. ***************
  1920. *** 669,676 ****
  1921.       printf("\r%s ON %s '%.35s'%s\n",
  1922.          kl->kill_flag & AUTO_KILL ? "KILL" : "SELECT",
  1923.          kl->kill_flag & ON_SUBJECT ? "SUBJECT" : "NAME",
  1924. !        kl->kill_flag & KILL_ON_REGEXP ? "*regexp*" : kl->kill_pattern,
  1925. !        kl->kill_flag & KILL_MUST_MATCH ? " (exact)" : "");
  1926.   
  1927.       return 0;
  1928.   }
  1929. --- 746,754 ----
  1930.       printf("\r%s ON %s '%.35s'%s\n",
  1931.          kl->kill_flag & AUTO_KILL ? "KILL" : "SELECT",
  1932.          kl->kill_flag & ON_SUBJECT ? "SUBJECT" : "NAME",
  1933. !        kl->kill_pattern,
  1934. !        kl->kill_flag & KILL_MUST_MATCH ? " (exact)" : 
  1935. !        kl->kill_flag & KILL_ON_REGEXP ? " (re)" : "");
  1936.   
  1937.       return 0;
  1938.   }
  1939.  
  1940. *** /usr/storm/nn6.3.2/MANIFEST    Wed Jun 28 20:07:53 1989
  1941. --- MANIFEST    Mon Jul 10 13:24:25 1989
  1942. ***************
  1943. *** 47,61 ****
  1944. --- 47,66 ----
  1945.   kill.c
  1946.   log_entry.c
  1947.   m-att3b.h
  1948. + m-convex.h
  1949.   m-dec3100.h
  1950.   m-gould.h
  1951.   m-hp9000.h
  1952. + m-i80286.h
  1953.   m-m680x0.h
  1954. + m-sgi4D.h
  1955.   m-sparc.h
  1956.   m-sun.h
  1957.   m-sun386i.h
  1958. + m-symmetry.h
  1959.   m-template.h
  1960.   m-vax.h
  1961. + m-xenix386.h
  1962.   macro.c
  1963.   master.c
  1964.   match.c
  1965. ***************
  1966. *** 95,111 ****
  1967. --- 100,122 ----
  1968.   regexp.h
  1969.   reroute.c
  1970.   routes.sample
  1971. + s-aux1-1.h
  1972.   s-bsd4-2.h
  1973.   s-bsd4-3.h
  1974.   s-dnix5-2.h
  1975. + s-dynix3-0.h
  1976. + s-fortune.h
  1977.   s-hpux.h
  1978.   s-hpux2-1.h
  1979.   s-hpux3-0.h
  1980. + s-sgi4D.h
  1981.   s-sunos3.h
  1982.   s-sunos4-0.h
  1983.   s-template.h
  1984.   s-tower32.h
  1985. + s-uport2-2.h
  1986.   s-usg3-1.h
  1987. + s-xenix386.h
  1988.   save.c
  1989.   selection.c
  1990.   sequence.c
  1991.  
  1992. *** /usr/storm/nn6.3.0/macro.c    Thu Jun  1 11:10:46 1989
  1993. --- macro.c    Wed Jul  5 16:52:14 1989
  1994. ***************
  1995. *** 76,82 ****
  1996.       struct macro *m1;
  1997.       
  1998.       m1 = (struct macro *)calloc(1, sizeof(struct macro));
  1999. !     mem_check(m1, sizeof(struct macro), "for macro");
  2000.   
  2001.       if (m == NULL)
  2002.       m = macro[cur_m] = m1;
  2003. --- 76,82 ----
  2004.       struct macro *m1;
  2005.       
  2006.       m1 = (struct macro *)calloc(1, sizeof(struct macro));
  2007. !     mem_check((char *)m1, sizeof(struct macro), "for macro");
  2008.   
  2009.       if (m == NULL)
  2010.       m = macro[cur_m] = m1;
  2011. ***************
  2012. *** 123,129 ****
  2013.       if (f == NULL) {
  2014.       clrdisp();
  2015.       printf("DEFINE MACRO %d -- END WITH 'end'\n\n\r", cur_m);
  2016. !     no_raw();
  2017.       f = stdin;
  2018.       }
  2019.       
  2020. --- 123,129 ----
  2021.       if (f == NULL) {
  2022.       clrdisp();
  2023.       printf("DEFINE MACRO %d -- END WITH 'end'\n\n\r", cur_m);
  2024. !     unset_raw();
  2025.       f = stdin;
  2026.       }
  2027.       
  2028.  
  2029. *** /usr/storm/nn6.3.0/nnmaster.1m    Thu Jun  1 11:10:58 1989
  2030. --- nnmaster.1m    Fri Jul  7 16:18:03 1989
  2031. ***************
  2032. *** 16,21 ****
  2033. --- 16,23 ----
  2034.   .B nnmaster
  2035.   [ \-\fBr [ \fP\fIN\fP ] ]
  2036.   [ \-\fBe\fP\fIN\fP ] 
  2037. + [ \-\fBy\fP\fIN\fP ] 
  2038. + [ \-\fBf\fP ]
  2039.   [ \-\fBC\fP ]
  2040.   [ \-\fBE\fP ]
  2041.   [ \-\fBu\fP ]
  2042. ***************
  2043. *** 60,66 ****
  2044.   .TP
  2045.   \-\fBr\fP [ \fImin\fP ]
  2046.   .br
  2047. ! Daemon mode.  The \fInnmaster\fP will put itself in the background,
  2048.   and will checks for arrival of new articles and expired articles every
  2049.   .I min
  2050.   minutes (and update the database accordingly).  If 
  2051. --- 62,69 ----
  2052.   .TP
  2053.   \-\fBr\fP [ \fImin\fP ]
  2054.   .br
  2055. ! Daemon mode.  The \fInnmaster\fP will put itself in the background
  2056. ! (unless \-\fBf\fP is also specified),
  2057.   and will checks for arrival of new articles and expired articles every
  2058.   .I min
  2059.   minutes (and update the database accordingly).  If 
  2060. ***************
  2061. *** 80,85 ****
  2062. --- 83,92 ----
  2063.   I cannot recommend this unless you receive batched news; invoking
  2064.   \fInnmaster\fP for every received article sounds too expensive to me.)
  2065.   .TP
  2066. + .B \-f
  2067. + Run \fInnmaster\fP in foreground in daemon mode (see \-\fBr\fP).
  2068. + Useful if \fInnmaster\fP is invoked from inittab.
  2069. + .TP
  2070.   \-\fBe\fP \fIart\fP
  2071.   .br
  2072.   Run internal
  2073. ***************
  2074. *** 102,107 ****
  2075. --- 109,122 ----
  2076.   expired articles on tape.)  You can then use the Expire command in
  2077.   \fInnadmin\fP(1M) to instruct the \fInnmaster\fP to expire individual
  2078.   or all groups.
  2079. + .TP
  2080. + \-\fBy\fP \fIretries\fP
  2081. + .br
  2082. + In some networked environment, opening an article (shared from another
  2083. + machine via NFS) may fail for no obvious reason.  Using this option,
  2084. + it is possible to cause 
  2085. + \fInnmaster\fP to perform \fIretries\fP attempts to open an article
  2086. + before marking the article as non-existing in the database.
  2087.   .TP
  2088.   .B \-C
  2089.   Perform a consistency check on the database on start-up, and rebuild
  2090.  
  2091. *** /usr/storm/nn6.3.3/master.c    Fri Jun 30 11:30:51 1989
  2092. --- master.c    Mon Jul 10 12:30:48 1989
  2093. ***************
  2094. *** 14,19 ****
  2095. --- 14,22 ----
  2096.    *
  2097.    *    -e N    expire a group if more than N articles are gone
  2098.    *    -r N    repeat every N minutes
  2099. +  *    -f    foreground execution (use with -r)
  2100. +  *    -y N    retry N times on error
  2101.    *
  2102.    *    -E    expire by recolleting entire groups rather than copying files
  2103.    *    -C    check consistency of database on start-up
  2104. ***************
  2105. *** 37,44 ****
  2106. --- 40,51 ----
  2107.       clean_to_expire = 0,
  2108.       check_on_startup = 0,
  2109.       repeat_delay = 0,
  2110. +     foreground = 0,
  2111.       debug_mode = 0;
  2112.   
  2113. + import int
  2114. +     retry_on_error;
  2115.   export int
  2116.       trace = 0,
  2117.   #ifdef NNTP
  2118. ***************
  2119. *** 57,62 ****
  2120. --- 64,72 ----
  2121.       'e', Int_Option( expire_level ),
  2122.       'r', Int_Option_Optional( repeat_delay, 10 ),
  2123.   
  2124. +     'f', Bool_Option( foreground ),
  2125. +     'y', Int_Option( retry_on_error ),
  2126.       'E', Bool_Option( clean_to_expire ),
  2127.       'C', Bool_Option( check_on_startup ),
  2128.   
  2129. ***************
  2130. *** 72,77 ****
  2131. --- 82,90 ----
  2132.   
  2133.   static int rm_mpid_on_exit = 0;
  2134.   
  2135. + extern long collect_group();
  2136. + extern long expire_group();
  2137.   main(argc, argv)
  2138.   int argc;
  2139.   char **argv;
  2140. ***************
  2141. *** 81,87 ****
  2142.       register int        cur_group;
  2143.       int                col_article_count, col_group_count;
  2144.       int                exp_article_count, exp_group_count;
  2145. !     int                temp;
  2146.       time_t            start_time;
  2147.       FILE            *m_pid;
  2148.       
  2149. --- 94,100 ----
  2150.       register int        cur_group;
  2151.       int                col_article_count, col_group_count;
  2152.       int                exp_article_count, exp_group_count;
  2153. !     long            temp;
  2154.       time_t            start_time;
  2155.       FILE            *m_pid;
  2156.       
  2157. ***************
  2158. *** 119,127 ****
  2159.       close(0);
  2160.       close(1);
  2161.       close(2);
  2162.       }
  2163.       
  2164. !     if (repeat_delay && !debug_mode) {
  2165.       while ((temp = fork()) < 0) sleep(1);
  2166.       if (temp) nn_exit(0);
  2167.   
  2168. --- 132,141 ----
  2169.       close(0);
  2170.       close(1);
  2171.       close(2);
  2172. +     if (open("/dev/null", 2) == 0) dup(0), dup(0);
  2173.       }
  2174.       
  2175. !     if (repeat_delay && !debug_mode && !foreground) {
  2176.       while ((temp = fork()) < 0) sleep(1);
  2177.       if (temp) nn_exit(0);
  2178.   
  2179. ***************
  2180. *** 216,226 ****
  2181.   
  2182.       gh = &active_groups[cur_group];
  2183.   
  2184. -     if (gh->group_flag & G_NO_DIRECTORY) {
  2185. -         if (gh->group_flag & G_BLOCKED) goto unblock_group;
  2186. -         continue;
  2187. -     }
  2188. -     
  2189.       if (gh->last_l_article  > gh->last_article || 
  2190.           gh->first_l_article > gh->first_article) {
  2191.           log_entry('X', "group %s renumbered", gh->group_name);
  2192. --- 230,235 ----
  2193. ***************
  2194. *** 250,262 ****
  2195.       
  2196.        do_collect:
  2197.       if (!init_group(gh)) {
  2198. !         log_entry('R', "%s: no directory", gh->group_name);
  2199. !         gh->group_flag |= G_NO_DIRECTORY;
  2200.           gh->group_flag &= ~(G_EXPIRE | G_BLOCKED);        
  2201.           save_group(current_group);
  2202.           continue;
  2203.       }
  2204.       
  2205.       if (gh->group_flag & G_EXPIRE) {
  2206.           if (clean_to_expire) {
  2207.           temp = gh->first_article - gh->first_l_article;
  2208. --- 259,281 ----
  2209.       
  2210.        do_collect:
  2211.       if (!init_group(gh)) {
  2212. !         if ((gh->group_flag & G_NO_DIRECTORY) == 0) {
  2213. !         log_entry('R', "%s: no directory", gh->group_name);
  2214. !         gh->group_flag |= G_NO_DIRECTORY;
  2215. !         }
  2216. !         gh->last_l_article = gh->last_article;
  2217. !         gh->first_l_article = gh->last_article;    /* OBS: not first */
  2218.           gh->group_flag &= ~(G_EXPIRE | G_BLOCKED);        
  2219.           save_group(current_group);
  2220.           continue;
  2221.       }
  2222.       
  2223. +     if (gh->group_flag & G_NO_DIRECTORY) {
  2224. +         /* The directory has been created now */
  2225. +         gh->group_flag &= ~G_NO_DIRECTORY;
  2226. +         clean_group(gh);
  2227. +     }
  2228. +     
  2229.       if (gh->group_flag & G_EXPIRE) {
  2230.           if (clean_to_expire) {
  2231.           temp = gh->first_article - gh->first_l_article;
  2232. ***************
  2233. *** 412,418 ****
  2234.   save_group(gh)
  2235.   group_header *gh;
  2236.   {
  2237. !     int flag;
  2238.       
  2239.       flag = gh->group_flag;
  2240.       gh->group_flag &= G_MASTER_FLAGS;
  2241. --- 431,437 ----
  2242.   save_group(gh)
  2243.   group_header *gh;
  2244.   {
  2245. !     int32 flag;
  2246.       
  2247.       flag = gh->group_flag;
  2248.       gh->group_flag &= G_MASTER_FLAGS;
  2249. ***************
  2250. *** 534,540 ****
  2251.       
  2252.       open_master(OPEN_CREATE);
  2253.   
  2254. !     fseek(master_file, sizeof(master), 0);
  2255.       
  2256.       master.number_of_groups = 0;
  2257.       
  2258. --- 553,559 ----
  2259.       
  2260.       open_master(OPEN_CREATE);
  2261.   
  2262. !     fseek(master_file, (off_t)sizeof(master), 0);
  2263.       
  2264.       master.number_of_groups = 0;
  2265.       
  2266. ***************
  2267. *** 546,557 ****
  2268.       groupname[group.group_name_length] = NUL;
  2269.       group.group_name = groupname;
  2270.   
  2271.       init_group(&group);
  2272.   
  2273.       clean_group(&group);
  2274.       
  2275. -     group.group_flag = 0;
  2276.       /* moderation flag will be set by first visit_active_file call */
  2277.   
  2278.       if (strcmp(groupname, "control") == 0)
  2279. --- 565,576 ----
  2280.       groupname[group.group_name_length] = NUL;
  2281.       group.group_name = groupname;
  2282.   
  2283. +     group.group_flag = 0;
  2284.       init_group(&group);
  2285.   
  2286.       clean_group(&group);
  2287.       
  2288.       /* moderation flag will be set by first visit_active_file call */
  2289.   
  2290.       if (strcmp(groupname, "control") == 0)
  2291. ***************
  2292. *** 649,655 ****
  2293.           visit_active_file();    /* just in case */
  2294.           Loop_Groups_Header(gh) {
  2295.           if (gh->first_l_article + arg2 < gh->first_article) {
  2296. !             gh->group_flag |= G_EXPIRE;
  2297.               save_group(gh);    /* could block here */
  2298.           }
  2299.           }
  2300. --- 668,674 ----
  2301.           visit_active_file();    /* just in case */
  2302.           Loop_Groups_Header(gh) {
  2303.           if (gh->first_l_article + arg2 < gh->first_article) {
  2304. !             gh->group_flag |= G_EXPIRE | G_BLOCKED;
  2305.               save_group(gh);    /* could block here */
  2306.           }
  2307.           }
  2308. ***************
  2309. *** 661,667 ****
  2310.           continue;
  2311.   
  2312.        case 'C':    /* clear flag */
  2313. !         gh->group_flag |= arg2;
  2314.           save_group(gh);
  2315.           continue;
  2316.   
  2317. --- 680,686 ----
  2318.           continue;
  2319.   
  2320.        case 'C':    /* clear flag */
  2321. !         gh->group_flag &= ~arg2;
  2322.           save_group(gh);
  2323.           continue;
  2324.   
  2325.  
  2326. *** /usr/storm/nn6.3.3/menu.c    Fri Jun 30 11:30:53 1989
  2327. --- menu.c    Sat Jul  8 19:28:08 1989
  2328. ***************
  2329. *** 7,12 ****
  2330. --- 7,13 ----
  2331.   #include "term.h"
  2332.   #include "keymap.h"
  2333.   #include "menu.h"
  2334. + #include "regexp.h"
  2335.   
  2336.   
  2337.   export int  preview_window = 0;    /* size of preview window */
  2338. ***************
  2339. *** 17,22 ****
  2340. --- 18,24 ----
  2341.   export int  delay_redraw   = 0; /* prompt again if :-command clears screen */
  2342.   
  2343.   export char *delayed_msg = NULL;    /* give to msg() after redraw */
  2344. + export long dl_msg_arg = 0;        /* optional arg to delayed_msg */
  2345.   
  2346.   import also_read_articles;
  2347.   import merged_menu;
  2348. ***************
  2349. *** 23,31 ****
  2350.   
  2351.   extern group_completion();
  2352.   
  2353.   static int firstl;    /* first menu line */
  2354.   
  2355. ! static int firsta;    /* first article on menu (0 based) */
  2356.   static int cura;    /* current article */
  2357.   static int next_cura;    /* article to become cura if >= 0 */
  2358.   static int numa;    /* no of articles on menu - 1 */
  2359. --- 25,35 ----
  2360.   
  2361.   extern group_completion();
  2362.   
  2363. + static regexp *regular_expr = NULL;
  2364.   static int firstl;    /* first menu line */
  2365.   
  2366. ! static article_number firsta;    /* first article on menu (0 based) */
  2367.   static int cura;    /* current article */
  2368.   static int next_cura;    /* article to become cura if >= 0 */
  2369.   static int numa;    /* no of articles on menu - 1 */
  2370. ***************
  2371. *** 45,50 ****
  2372. --- 49,55 ----
  2373.   #define    SAVED    4
  2374.   #define    REMOVE    5
  2375.   #define CANCEL    6
  2376. + #define    ON_LEAVE 7
  2377.   
  2378.   static int how;
  2379.   
  2380. ***************
  2381. *** 74,84 ****
  2382.           how = OFF;
  2383.           goto toggle;
  2384.       }
  2385.       ah->flag |= A_SELECT;
  2386.       break;
  2387.       
  2388.        case OFF:
  2389. !     ah->flag &= ~A_SELECT;
  2390.       break;
  2391.   
  2392.        case INIT:
  2393. --- 79,90 ----
  2394.           how = OFF;
  2395.           goto toggle;
  2396.       }
  2397. +     ah->flag &= ~(A_LEAVE | A_READ);
  2398.       ah->flag |= A_SELECT;
  2399.       break;
  2400.       
  2401.        case OFF:
  2402. !     ah->flag &= ~(A_SELECT | A_AUTO);
  2403.       break;
  2404.   
  2405.        case INIT:
  2406. ***************
  2407. *** 99,111 ****
  2408.       return;
  2409.   
  2410.        case CANCEL:
  2411. !     gotoxy(1, lno);
  2412. !     if (ah->flag & A_SELECT) {
  2413. !         ah->flag &= ~A_SELECT;
  2414.           break;
  2415.       }
  2416.       putchar((ah->flag & A_CANCEL) ? '#' : ' ');
  2417.       return;
  2418.       }
  2419.   
  2420.       if (cura < 0 || cura > numa) return;
  2421. --- 105,126 ----
  2422.       return;
  2423.   
  2424.        case CANCEL:
  2425. !     if (must_print && (ah->flag & A_SELECT)) {
  2426. !         ah->flag &= ~(A_SELECT | A_AUTO);
  2427.           break;
  2428.       }
  2429. +     ah->flag &= ~(A_SELECT | A_AUTO | A_LEAVE | A_LEAVE_NEXT | A_READ);
  2430. +     gotoxy(1, lno);
  2431.       putchar((ah->flag & A_CANCEL) ? '#' : ' ');
  2432.       return;
  2433. +      case ON_LEAVE:
  2434. +     if (cura < 0 || cura > numa) return;
  2435. +     gotoxy(1, lno);
  2436. +     putchar((ah->flag & A_LEAVE) ? '+' :
  2437. +         (ah->flag & A_LEAVE_NEXT) ? '=' : ' ');
  2438. +     return;
  2439. +     
  2440.       }
  2441.   
  2442.       if (cura < 0 || cura > numa) return;
  2443. ***************
  2444. *** 124,132 ****
  2445.   
  2446.       if (fmt_linenum > 4) fmt_linenum = 1;
  2447.       
  2448. !     if (ah->flag & A_CANCEL) {
  2449.           gotoxy(1, lno);
  2450. !         putchar('#');
  2451.       } else
  2452.       if (how == ON) {
  2453.           if (so_gotoxy(1, lno, 1) == 0) putchar('*');
  2454. --- 139,152 ----
  2455.   
  2456.       if (fmt_linenum > 4) fmt_linenum = 1;
  2457.       
  2458. !     if (ah->flag & (A_CANCEL | A_LEAVE | A_LEAVE_NEXT | A_READ)) {
  2459.           gotoxy(1, lno);
  2460. !         putchar(
  2461. !             (ah->flag & A_READ) ? '.' :
  2462. !             (ah->flag & A_LEAVE) ? '+' :
  2463. !             (ah->flag & A_CANCEL) ? '#' :
  2464. !             '='
  2465. !             );
  2466.       } else
  2467.       if (how == ON) {
  2468.           if (so_gotoxy(1, lno, 1) == 0) putchar('*');
  2469. ***************
  2470. *** 187,196 ****
  2471.           so_printf(ah->lines >= 0 ? " +%d" : " +?", ah->lines);
  2472.   
  2473.       so_end();
  2474. !     } else
  2475.       putchar((how == OFF) ? ' ' : '*');
  2476. !     
  2477. !     fl;
  2478.       
  2479.       return;
  2480.   }
  2481. --- 207,216 ----
  2482.           so_printf(ah->lines >= 0 ? " +%d" : " +?", ah->lines);
  2483.   
  2484.       so_end();
  2485. !     } else {
  2486. !     gotoxy(1, lno);
  2487.       putchar((how == OFF) ? ' ' : '*');
  2488. !     }    
  2489.       
  2490.       return;
  2491.   }
  2492. ***************
  2493. *** 273,284 ****
  2494.   {
  2495.       register         k_cmd, cur_k_cmd;
  2496.       register        article_header *ah;
  2497. !     int            last_k_cmd, last_how, was_selected;
  2498.       int         seen_all, menu_cmd, temp;
  2499. !     int         save_selected, last_save;
  2500.       int            doing_unshar, did_unshar;
  2501.       char         *fname, *savemode, *init_save();
  2502. !     int         nexta;    /* first article on next menu */
  2503.       int         maxa;    /* max no of articles per menu page */
  2504.       int         o_firsta, o_mode;    /* for recursive calls */
  2505.       static        menu_level = 0;
  2506. --- 293,305 ----
  2507.   {
  2508.       register         k_cmd, cur_k_cmd;
  2509.       register        article_header *ah;
  2510. !     int            last_k_cmd, last_how;
  2511.       int         seen_all, menu_cmd, temp;
  2512. !     int         save_selected;
  2513. !     article_number    last_save;
  2514.       int            doing_unshar, did_unshar;
  2515.       char         *fname, *savemode, *init_save();
  2516. !     article_number    nexta;    /* first article on next menu */
  2517.       int         maxa;    /* max no of articles per menu page */
  2518.       int         o_firsta, o_mode;    /* for recursive calls */
  2519.       static        menu_level = 0;
  2520. ***************
  2521. *** 285,290 ****
  2522. --- 306,312 ----
  2523.       char        purpose[80], pr_fmt[60];
  2524.       extern int         enable_stop, file_completion();
  2525.       extern int        alt_cmd_key, in_menu_mode, slow_mode, any_message;
  2526. +     article_number    elim_list[3];
  2527.       
  2528.   #define    menu_return(cmd) \
  2529.       { menu_cmd = (cmd); goto menu_exit; }
  2530. ***************
  2531. *** 373,379 ****
  2532.           REDRAW_CHECK;
  2533.       
  2534.           how = INIT;
  2535. !         mark(); fl;
  2536.           
  2537.           if (s_keyboard) {      /* Signal may have corrupted output.  */
  2538.           if (cura == 0)
  2539. --- 395,401 ----
  2540.           REDRAW_CHECK;
  2541.       
  2542.           how = INIT;
  2543. !         mark(); /* fl; */
  2544.           
  2545.           if (s_keyboard) {      /* Signal may have corrupted output.  */
  2546.           if (cura == 0)
  2547. ***************
  2548. *** 389,395 ****
  2549.           
  2550.           nexta++; cura++;
  2551.       }
  2552. !     
  2553.       s_keyboard = 0;
  2554.   
  2555.       prompt_line = firstl + cura;
  2556. --- 411,418 ----
  2557.           
  2558.           nexta++; cura++;
  2559.       }
  2560. !     fl;
  2561.       s_keyboard = 0;
  2562.   
  2563.       prompt_line = firstl + cura;
  2564. ***************
  2565. *** 419,425 ****
  2566.           pct(0L, (long)(n_articles-1), (long)firsta, (long)(firsta+numa)));
  2567.   
  2568.        if (delayed_msg != NULL) {
  2569. !      msg(delayed_msg);
  2570.        delayed_msg = NULL;
  2571.        }
  2572.   
  2573. --- 442,448 ----
  2574.           pct(0L, (long)(n_articles-1), (long)firsta, (long)(firsta+numa)));
  2575.   
  2576.        if (delayed_msg != NULL) {
  2577. !      msg(delayed_msg, dl_msg_arg);
  2578.        delayed_msg = NULL;
  2579.        }
  2580.   
  2581. ***************
  2582. *** 584,590 ****
  2583.            if (save(ah)) {
  2584.                if (doing_unshar) {
  2585.                if (save_selected)
  2586. !                  ah->flag &= ~A_SELECT;
  2587.                } else
  2588.                if (cura >= 0 && cura <= numa) {
  2589.                how = save_selected ? OFF : SAVED;
  2590. --- 607,613 ----
  2591.            if (save(ah)) {
  2592.                if (doing_unshar) {
  2593.                if (save_selected)
  2594. !                  ah->flag &= ~(A_SELECT | A_AUTO);
  2595.                } else
  2596.                if (cura >= 0 && cura <= numa) {
  2597.                how = save_selected ? OFF : SAVED;
  2598. ***************
  2599. *** 592,598 ****
  2600.                how = TOGGLE;
  2601.                } else
  2602.                if (save_selected)
  2603. !              ah->flag &= ~A_SELECT;
  2604.            }
  2605.            }
  2606.        }
  2607. --- 615,621 ----
  2608.                how = TOGGLE;
  2609.                } else
  2610.                if (save_selected)
  2611. !              ah->flag &= ~(A_SELECT | A_AUTO);
  2612.            }
  2613.            }
  2614.        }
  2615. ***************
  2616. *** 680,686 ****
  2617.        goto redraw;
  2618.   
  2619.         case K_KILL_HANDLING:
  2620. !      kill_menu((article_header *)NULL);
  2621.        goto Prompt;
  2622.   
  2623.         case K_CONTINUE:    /* goto next menu page or show the articles */
  2624. --- 703,728 ----
  2625.        goto redraw;
  2626.   
  2627.         case K_KILL_HANDLING:
  2628. !      switch (kill_menu((article_header *)NULL)) {
  2629. !       case 0:        /* select */
  2630. !          do_auto_select((regexp *)NULL, 2);
  2631. !          break;
  2632. !       case 1:        /* kill */
  2633. !          if (!do_auto_kill()) break;
  2634. !          elim_list[0] = firsta;
  2635. !          elim_list[1] = firsta + cura;
  2636. !          elim_list[2] = nexta;
  2637. !          if (elim_articles(elim_list, 3)) {
  2638. !          firsta = elim_list[0];
  2639. !          goto redraw;
  2640. !          }
  2641. !          firsta = elim_list[0];
  2642. !          cura   = elim_list[1] - firsta;
  2643. !          nexta  = elim_list[2];
  2644. !          break;
  2645. !       default:
  2646. !          break;
  2647. !      }
  2648.        goto Prompt;
  2649.   
  2650.         case K_CONTINUE:    /* goto next menu page or show the articles */
  2651. ***************
  2652. *** 797,803 ****
  2653.   
  2654.         case K_UNSELECT_ALL:
  2655.        for (cura = -firsta; cura < n_articles - firsta; cura++) {
  2656. !          how = OFF;
  2657.            mark();
  2658.        }
  2659.        fl;
  2660. --- 839,851 ----
  2661.   
  2662.         case K_UNSELECT_ALL:
  2663.        for (cura = -firsta; cura < n_articles - firsta; cura++) {
  2664. !          if (last_k_cmd == K_UNSELECT_ALL) {
  2665. !          if ((articles[firsta + cura]->flag & (A_LEAVE | A_LEAVE_NEXT)) == 0)
  2666. !              continue;
  2667. !          articles[firsta + cura]->flag &= ~(A_LEAVE | A_LEAVE_NEXT);
  2668. !          how = ON_LEAVE;
  2669. !          } else
  2670. !          how = OFF;
  2671.            mark();
  2672.        }
  2673.        fl;
  2674. ***************
  2675. *** 872,880 ****
  2676.        goto Prompt;
  2677.   
  2678.         case K_AUTO_SELECT:
  2679. !      do_auto_select();
  2680.        goto same_prompt;
  2681.   
  2682.         case K_NEXT_PAGE:
  2683.        if (nexta < n_articles) goto nextmenu;
  2684.        if (firsta == 0) goto same_prompt;
  2685. --- 920,945 ----
  2686.        goto Prompt;
  2687.   
  2688.         case K_AUTO_SELECT:
  2689. !      do_auto_select((regexp *)NULL, 1);
  2690.        goto same_prompt;
  2691.   
  2692. +      case K_GOTO_MATCH:
  2693. +      prompt("\1Select regexp\1 ");
  2694. +      if ((fname = get_s(NONE, NONE, NONE, NO_COMPLETION)) == NULL) 
  2695. +          goto Prompt;
  2696. +      if (*fname != NUL) {
  2697. +          if (regular_expr) free((char *)regular_expr);
  2698. +          regular_expr = regcomp(fname);
  2699. +      }
  2700. +      if (regular_expr == NULL)
  2701. +         msg("No previous expression");
  2702. +      else
  2703. +         do_auto_select(regular_expr, 2);
  2704. +      goto Prompt;
  2705. +     
  2706.         case K_NEXT_PAGE:
  2707.        if (nexta < n_articles) goto nextmenu;
  2708.        if (firsta == 0) goto same_prompt;
  2709. ***************
  2710. *** 922,931 ****
  2711.         preview_next:
  2712.        ah = articles[firsta+article_id];
  2713.        cura = article_id + 1;
  2714. !      was_selected = (ah->flag & A_SELECT);
  2715.        switch (more(ah, MM_PREVIEW, prompt_line)) {
  2716.            
  2717.         case MC_REDRAW:
  2718.            next_cura = cura;
  2719.            goto redraw;
  2720. --- 987,1014 ----
  2721.         preview_next:
  2722.        ah = articles[firsta+article_id];
  2723.        cura = article_id + 1;
  2724. !      
  2725. !      no_raw();
  2726.        switch (more(ah, MM_PREVIEW, prompt_line)) {
  2727.            
  2728. +       case MC_DO_KILL:
  2729. +          if (!do_auto_kill()) break;
  2730. +          elim_list[0] = firsta;
  2731. +          elim_list[1] = firsta + cura;
  2732. +          elim_articles(elim_list, 2);
  2733. +          firsta = elim_list[0];
  2734. +          next_cura = elim_list[1] - firsta;
  2735. +          goto redraw;
  2736. +          
  2737. +       case MC_DO_SELECT:
  2738. +          if (prompt_line >= 0) { /* not redrawn */
  2739. +          do_auto_select((regexp *)NULL, 2);
  2740. +          break;
  2741. +          }
  2742. +          numa = -1;
  2743. +          do_auto_select((regexp *)NULL, 2);
  2744. +          /* FALL THRU */
  2745.         case MC_REDRAW:
  2746.            next_cura = cura;
  2747.            goto redraw;
  2748. ***************
  2749. *** 947,956 ****
  2750.            if ((firsta + cura) >= n_articles) goto redraw;
  2751.            prompt_line = Lines;
  2752.            } else {
  2753. !          if ((ah->flag & A_SELECT) && was_selected == 0) {
  2754.                cura--;
  2755. !              ah->flag &= ~A_SELECT;
  2756. !              how = ON;
  2757.                mark();
  2758.                cura++;
  2759.            }
  2760. --- 1030,1038 ----
  2761.            if ((firsta + cura) >= n_articles) goto redraw;
  2762.            prompt_line = Lines;
  2763.            } else {
  2764. !          if (ah->flag & (A_LEAVE | A_LEAVE_NEXT)) {
  2765.                cura--;
  2766. !              how = ON_LEAVE;
  2767.                mark();
  2768.                cura++;
  2769.            }
  2770. ***************
  2771. *** 995,1001 ****
  2772.   
  2773.   static show_articles()
  2774.   {
  2775. !     register cur, next, mode;
  2776.       int cmd, prev = -1, again;
  2777.       
  2778.       do {
  2779. --- 1077,1086 ----
  2780.   
  2781.   static show_articles()
  2782.   {
  2783. !     register article_number cur, next;
  2784. !     register article_header *ah;
  2785. !     article_number elim_list[1];
  2786. !     register int mode;
  2787.       int cmd, prev = -1, again;
  2788.       
  2789.       do {
  2790. ***************
  2791. *** 1011,1017 ****
  2792.           if (articles[next]->flag & A_SELECT) break;
  2793.           }
  2794.           
  2795. !         articles[cur]->flag &= ~A_SELECT;
  2796.           
  2797.        show:
  2798.           mode = 0;
  2799. --- 1096,1102 ----
  2800.           if (articles[next]->flag & A_SELECT) break;
  2801.           }
  2802.           
  2803. !         articles[cur]->flag &= ~(A_SELECT | A_AUTO);
  2804.           
  2805.        show:
  2806.           mode = 0;
  2807. ***************
  2808. *** 1020,1029 ****
  2809.           if ((cur + 1) >= n_articles) mode |= MM_LAST_ARTICLE;
  2810.           if (cur == 0) mode |= MM_FIRST_ARTICLE;
  2811.           
  2812. !         cmd = more(articles[cur], mode, 0);
  2813.           
  2814.           switch(cmd) {
  2815.           
  2816.            case MC_PREV:
  2817.           if (prev == next) break;
  2818.           
  2819. --- 1105,1132 ----
  2820.           if ((cur + 1) >= n_articles) mode |= MM_LAST_ARTICLE;
  2821.           if (cur == 0) mode |= MM_FIRST_ARTICLE;
  2822.           
  2823. !         cmd = more(ah = articles[cur], mode, 0);
  2824.           
  2825.           switch(cmd) {
  2826. +          
  2827. +          case MC_DO_KILL:
  2828. +         if (do_auto_kill()) {
  2829. +             elim_list[0] = next;
  2830. +             elim_articles(elim_list, 1);
  2831. +             cur = elim_list[0];
  2832. +             if (cur <= 0) cur = n_articles;
  2833. +             continue;
  2834. +         }
  2835. +         break;
  2836.           
  2837. +          case MC_DO_SELECT:
  2838. +         for (next = cur+1, cur = -1; next < n_articles; next++) {
  2839. +             if (auto_select_article(ah = articles[next], 2)) 
  2840. +             ah->flag |= A_SELECT;
  2841. +             if (cur < 0 && ah->flag & A_SELECT) cur = next;
  2842. +         }
  2843. +         continue;
  2844. +         
  2845.            case MC_PREV:
  2846.           if (prev == next) break;
  2847.           
  2848. ***************
  2849. *** 1031,1039 ****
  2850.           goto show;
  2851.           
  2852.            case MC_NEXTSUBJ:
  2853.           for (next = cur+1; next < n_articles; next++) {
  2854. !             if ((articles[next]->flag & A_SAME) == 0) break;
  2855. !             articles[next]->flag &= ~A_SELECT;
  2856.           }
  2857.           for (; next < n_articles; next++) {
  2858.               if (articles[next]->flag & A_SELECT) break;
  2859. --- 1134,1143 ----
  2860.           goto show;
  2861.           
  2862.            case MC_NEXTSUBJ:
  2863. +         ah->flag |= A_READ;
  2864.           for (next = cur+1; next < n_articles; next++) {
  2865. !             if (((ah = articles[next])->flag & A_SAME) == 0) break;
  2866. !             ah->flag &= ~(A_SELECT | A_AUTO | A_LEAVE | A_LEAVE_NEXT);
  2867.           }
  2868.           for (; next < n_articles; next++) {
  2869.               if (articles[next]->flag & A_SELECT) break;
  2870. ***************
  2871. *** 1042,1049 ****
  2872.           
  2873.            case MC_ALLSUBJ:
  2874.           for (next = cur+1; next < n_articles; next++) {
  2875. !             if ((articles[next]->flag & A_SAME) == 0) break;
  2876. !             articles[next]->flag |= A_SELECT;
  2877.           }
  2878.           for (next = cur+1; next < n_articles; next++)
  2879.               if (articles[next]->flag & A_SELECT) break;
  2880. --- 1146,1155 ----
  2881.           
  2882.            case MC_ALLSUBJ:
  2883.           for (next = cur+1; next < n_articles; next++) {
  2884. !             ah = articles[next];
  2885. !             if ((ah->flag & A_SAME) == 0) break;
  2886. !             ah->flag &= ~(A_AUTO | A_LEAVE | A_LEAVE_NEXT | A_READ);
  2887. !             ah->flag |= A_SELECT;
  2888.           }
  2889.           for (next = cur+1; next < n_articles; next++)
  2890.               if (articles[next]->flag & A_SELECT) break;
  2891. ***************
  2892. *** 1050,1056 ****
  2893.           break;
  2894.           
  2895.            case MC_MENU:
  2896. !         articles[cur]->flag |= A_SELECT;
  2897.           firsta = cur - 5;
  2898.           if (firsta < 0) firsta = 0;
  2899.           next_cura = cur - firsta;
  2900. --- 1156,1162 ----
  2901.           break;
  2902.           
  2903.            case MC_MENU:
  2904. !         ah->flag |= A_SELECT;
  2905.           firsta = cur - 5;
  2906.           if (firsta < 0) firsta = 0;
  2907.           next_cura = cur - firsta;
  2908. ***************
  2909. *** 1058,1067 ****
  2910.           return SH_MENU;
  2911.           
  2912.            case MC_QUIT:
  2913.           return SH_QUIT;
  2914.           
  2915.            case MC_NEXT:
  2916. !         if (articles[cur]->flag & A_SELECT) again++;
  2917.           break;
  2918.   
  2919.            case MC_BACK_ART:
  2920. --- 1164,1175 ----
  2921.           return SH_MENU;
  2922.           
  2923.            case MC_QUIT:
  2924. +         ah->flag |= A_SELECT;
  2925.           return SH_QUIT;
  2926.           
  2927.            case MC_NEXT:
  2928. !         if ((ah->flag & (A_LEAVE | A_LEAVE_NEXT)) == 0)
  2929. !             ah->flag |= A_READ;
  2930.           break;
  2931.   
  2932.            case MC_BACK_ART:
  2933. ***************
  2934. *** 1076,1081 ****
  2935. --- 1184,1190 ----
  2936.           break;
  2937.           
  2938.            case MC_NEXTGROUP:
  2939. +         ah->flag |= A_SELECT;
  2940.           return SH_NEXT;
  2941.           
  2942.            case MC_READGROUP:
  2943. ***************
  2944. *** 1085,1093 ****
  2945.           prev = cur; cur = next;
  2946.       }
  2947.   
  2948. !     if (again > 1)
  2949. !         delayed_msg = "Showing this and the following articles again";
  2950. !     else
  2951.           if (again == 1)
  2952.           delayed_msg = "Showing article again";
  2953.       
  2954. --- 1194,1215 ----
  2955.           prev = cur; cur = next;
  2956.       }
  2957.   
  2958. !     for (cur = 0; cur < n_articles; cur++) 
  2959. !         if (articles[cur]->flag & A_SELECT) continue;
  2960. !     for (cur = 0; cur < n_articles; cur++) {
  2961. !         ah = articles[cur];
  2962. !         if (ah->flag & A_LEAVE) {
  2963. !         ah->flag &= ~A_LEAVE;
  2964. !         ah->flag |= A_SELECT;
  2965. !         again++;
  2966. !         }
  2967. !     }
  2968. !     if (again > 1) {
  2969. !         delayed_msg = "Showing %ld articles again";
  2970. !         dl_msg_arg = again;
  2971. !     } else
  2972.           if (again == 1)
  2973.           delayed_msg = "Showing article again";
  2974.       
  2975. ***************
  2976. *** 1155,1163 ****
  2977.    *    if article is in range firsta..firsta+numa (incl) mark article
  2978.    */
  2979.   
  2980. ! static do_auto_select()
  2981.   {
  2982. !     register int i;
  2983.       register article_header *ah, **ahp;
  2984.       int count = 0, o_cura;
  2985.       
  2986. --- 1277,1287 ----
  2987.    *    if article is in range firsta..firsta+numa (incl) mark article
  2988.    */
  2989.   
  2990. ! static do_auto_select(re, mode)
  2991. ! regexp *re;
  2992. ! int mode;
  2993.   {
  2994. !     register article_number i;
  2995.       register article_header *ah, **ahp;
  2996.       int count = 0, o_cura;
  2997.       
  2998. ***************
  2999. *** 1165,1185 ****
  3000.       
  3001.       for (i = 0, ahp = articles; i < n_articles; i++, ahp++) {
  3002.       ah = *ahp;
  3003. !     if (auto_select_article(ah)) {
  3004. !         count++;
  3005. !         if (ah->flag & A_SELECT) continue;
  3006. !         if (firsta <= i && i <= (firsta+numa)) {
  3007. !         cura = i - firsta;
  3008. !         how = ON;
  3009. !         mark();
  3010. !         } else
  3011. !         ah->flag |= A_SELECT;
  3012. !     }
  3013.       }
  3014.       
  3015.       msg(count == 0 ? "No selections" : "Selected %d article%s",
  3016.          count, count > 1 ? "s" : "");
  3017.       cura = o_cura;
  3018.   }
  3019.   
  3020.           
  3021. --- 1289,1329 ----
  3022.       
  3023.       for (i = 0, ahp = articles; i < n_articles; i++, ahp++) {
  3024.       ah = *ahp;
  3025. !     if (re != NULL) {
  3026. !         if (!regexec(re, ah->subject)) continue;
  3027. !     } else
  3028. !         if (!auto_select_article(ah, mode)) continue;
  3029. !     
  3030. !     count++;
  3031. !     if (ah->flag & A_SELECT) continue;
  3032. !     if (firsta <= i && i <= (firsta+numa)) {
  3033. !         cura = i - firsta;
  3034. !         how = ON;
  3035. !         mark();
  3036. !     } else
  3037. !         ah->flag |= A_SELECT;
  3038.       }
  3039.       
  3040.       msg(count == 0 ? "No selections" : "Selected %d article%s",
  3041.          count, count > 1 ? "s" : "");
  3042.       cura = o_cura;
  3043. + }
  3044. + static do_auto_kill()
  3045. + {
  3046. +     register article_number i;
  3047. +     register article_header *ah, **ahp;
  3048. +     int any = 0;
  3049. +     
  3050. +     for (i = 0, ahp = articles; i < n_articles; i++, ahp++) {
  3051. +     ah = *ahp;
  3052. +     if (auto_select_article(ah, 0)) {
  3053. +         ah->flag |= A_KILL;
  3054. +         ah->flag &= ~(A_SELECT | A_AUTO);
  3055. +         any = 1;
  3056. +     }
  3057. +     }
  3058. +     return any;
  3059.   }
  3060.   
  3061.           
  3062.  
  3063. *** /usr/storm/nn6.3.3/menu.h    Fri Jun 30 11:30:55 1989
  3064. --- menu.h    Thu Jul  6 00:06:59 1989
  3065. ***************
  3066. *** 33,38 ****
  3067. --- 33,40 ----
  3068.   #define MC_NO_REDRAW    11    /* screen is not corrupted */
  3069.   #define    MC_BACK_ART    12    /* back one article (don't deselect cur) */
  3070.   #define MC_FORW_ART    13    /* forward one article (deselect cur) */
  3071. + #define MC_DO_KILL    14    /* did kill-select kill */
  3072. + #define MC_DO_SELECT    15    /* did kill-select selection */
  3073.   
  3074.   /* more modes */
  3075.   
  3076.  
  3077. *** /usr/storm/nn6.3.3/more.c    Fri Jun 30 11:30:56 1989
  3078. --- more.c    Sat Jul  8 19:24:54 1989
  3079. ***************
  3080. *** 16,21 ****
  3081. --- 16,22 ----
  3082.   import int  novice;
  3083.   
  3084.   import char *delayed_msg;
  3085. + import long dl_msg_arg;
  3086.   
  3087.   extern char *init_save();
  3088.   
  3089. ***************
  3090. *** 47,52 ****
  3091. --- 48,54 ----
  3092.       'S', "Subject",    &news.ng_subj,        &digest.dg_subj,
  3093.       'W', "Followup-To",    &news.ng_follow,    0,
  3094.       'X', "References",    &news.ng_ref,        0,
  3095. +     'Y', "Summary",    &news.ng_summ,        0,
  3096.       0
  3097.   };
  3098.   
  3099. ***************
  3100. *** 54,60 ****
  3101.   int32 flag;
  3102.   {
  3103.       static char buf[40];
  3104. !     register char *cp, *sp;
  3105.       static int32 prevflag = 0;
  3106.       
  3107.       flag &= A_ST_FILED | A_ST_REPLY | A_ST_FOLLOW;
  3108. --- 56,62 ----
  3109.   int32 flag;
  3110.   {
  3111.       static char buf[40];
  3112. !     register char *cp;
  3113.       static int32 prevflag = 0;
  3114.       
  3115.       flag &= A_ST_FILED | A_ST_REPLY | A_ST_FOLLOW;
  3116. ***************
  3117. *** 108,114 ****
  3118.       int underline_line, fake_underline;
  3119.       int match_lines, match_redraw, match_topline, match_botline;
  3120.       int goto_line, prev_goto, stop_line, extra_lines;
  3121. !     int in_digest = ah->flag & A_DIGEST;
  3122.       article_header digestah;
  3123.       char *fname, *hdrline;
  3124.       extern STANDOUT;
  3125. --- 110,116 ----
  3126.       int underline_line, fake_underline;
  3127.       int match_lines, match_redraw, match_topline, match_botline;
  3128.       int goto_line, prev_goto, stop_line, extra_lines;
  3129. !     int32 in_digest = ah->flag & A_DIGEST;
  3130.       article_header digestah;
  3131.       char *fname, *hdrline;
  3132.       extern STANDOUT;
  3133. ***************
  3134. *** 622,628 ****
  3135.          a_st_flags(ah->flag));
  3136.   
  3137.       if (delayed_msg != NULL) {
  3138. !     msg(delayed_msg);
  3139.       delayed_msg = NULL;
  3140.       }
  3141.       
  3142. --- 624,630 ----
  3143.          a_st_flags(ah->flag));
  3144.   
  3145.       if (delayed_msg != NULL) {
  3146. !     msg(delayed_msg, dl_msg_arg);
  3147.       delayed_msg = NULL;
  3148.       }
  3149.       
  3150. ***************
  3151. *** 657,663 ****
  3152.       }
  3153.   #endif    
  3154.        goto redraw;
  3155. !     
  3156.        case K_CONTINUE:
  3157.       if (eof) break;
  3158.       if (screen_offset == 0 && form_feed == 0 && stop_line) {
  3159. --- 659,672 ----
  3160.       }
  3161.   #endif    
  3162.        goto redraw;
  3163. !      case K_NEXT_PAGE:
  3164. !     if (eof) {
  3165. !         ding();
  3166. !         goto same_prompt;
  3167. !     }
  3168. !     /* FALL THRU */
  3169. !         
  3170.        case K_CONTINUE:
  3171.       if (eof) break;
  3172.       if (screen_offset == 0 && form_feed == 0 && stop_line) {
  3173. ***************
  3174. *** 755,761 ****
  3175.       goto redraw;
  3176.       
  3177.        case K_KILL_HANDLING:
  3178. !     kill_menu(ah);
  3179.       goto Prompt;
  3180.       
  3181.        case K_READ_GROUP_UPDATE:
  3182. --- 764,777 ----
  3183.       goto redraw;
  3184.       
  3185.        case K_KILL_HANDLING:
  3186. !     switch (kill_menu(ah)) {
  3187. !      case 0:
  3188. !         more_return(MC_DO_SELECT);
  3189. !      case 1:
  3190. !         more_return(MC_DO_KILL);
  3191. !      default:
  3192. !         break;
  3193. !     }
  3194.       goto Prompt;
  3195.       
  3196.        case K_READ_GROUP_UPDATE:
  3197. ***************
  3198. *** 812,822 ****
  3199.       clrpage(prompt_line);
  3200.       no_raw();
  3201.       
  3202. !     if (print_lines + lno < Lines)
  3203.           goto next_page;
  3204.           
  3205.       gotoxy(0, Lines-1);
  3206. !     c = print_lines + lno - Lines + 1;
  3207.       while (--c >= 0) {
  3208.           putchar(NL);
  3209.           if (--lno1 < 0) topline++;
  3210. --- 828,838 ----
  3211.       clrpage(prompt_line);
  3212.       no_raw();
  3213.       
  3214. !     if (print_lines + lno < (Lines - 1))
  3215.           goto next_page;
  3216.           
  3217.       gotoxy(0, Lines-1);
  3218. !     c = print_lines + lno - Lines + 2;
  3219.       while (--c >= 0) {
  3220.           putchar(NL);
  3221.           if (--lno1 < 0) topline++;
  3222. ***************
  3223. *** 893,899 ****
  3224.           goto Prompt;
  3225.   
  3226.       if (*fname && *fname != '/') {
  3227. !         if (regular_expr) free(regular_expr);
  3228.           regular_expr = regcomp(fname);
  3229.       }
  3230.   
  3231. --- 909,915 ----
  3232.           goto Prompt;
  3233.   
  3234.       if (*fname && *fname != '/') {
  3235. !         if (regular_expr) free((char *)regular_expr);
  3236.           regular_expr = regcomp(fname);
  3237.       }
  3238.   
  3239. ***************
  3240. *** 941,947 ****
  3241.       }
  3242.   
  3243.        case K_LEAVE_ARTICLE:
  3244. !     ah->flag |= A_SELECT;
  3245.       /* fall thru */
  3246.   
  3247.        case K_NEXT_ARTICLE:
  3248. --- 957,964 ----
  3249.       }
  3250.   
  3251.        case K_LEAVE_ARTICLE:
  3252. !     ah->flag &= ~(A_SELECT | A_AUTO | A_READ);
  3253. !     ah->flag |= A_LEAVE;
  3254.       /* fall thru */
  3255.   
  3256.        case K_NEXT_ARTICLE:
  3257. ***************
  3258. *** 1008,1014 ****
  3259.       if ((mode & MM_PREVIEW) && more_cmd != MC_QUIT) {
  3260.       gotoxy(0, screen_offset);
  3261.       clrpage(screen_offset);
  3262. !     if (more_cmd == MC_PREVIEW_NEXT) {
  3263.           if (screen_offset == 0) prompt_line = -1;
  3264.       } else {
  3265.           if (screen_offset == 0) return MC_REDRAW;
  3266. --- 1025,1032 ----
  3267.       if ((mode & MM_PREVIEW) && more_cmd != MC_QUIT) {
  3268.       gotoxy(0, screen_offset);
  3269.       clrpage(screen_offset);
  3270. !     if (more_cmd == MC_PREVIEW_NEXT ||
  3271. !         more_cmd == MC_DO_SELECT || more_cmd == MC_DO_KILL) {
  3272.           if (screen_offset == 0) prompt_line = -1;
  3273.       } else {
  3274.           if (screen_offset == 0) return MC_REDRAW;
  3275.  
  3276. *** /usr/storm/nn6.3.0/news.c    Thu Jun  1 11:10:47 1989
  3277. --- news.c    Mon Jul  3 17:59:12 1989
  3278. ***************
  3279. *** 66,71 ****
  3280. --- 66,72 ----
  3281.           news.ng_dist     = NULL;
  3282.           news.ng_org     = NULL;
  3283.           news.ng_appr     = NULL;
  3284. +         news.ng_summ    = NULL;
  3285.           news.ng_date    = NULL;
  3286.       }
  3287.   
  3288. ***************
  3289. *** 225,230 ****
  3290. --- 226,233 ----
  3291.       check("ubject: ",     8, ng_subj);
  3292.       if (news.ng_from == NULL)
  3293.           check("ender: ",     7, ng_from);
  3294. +     if (!all) break;
  3295. +     check("ummary: ",     8, ng_summ);
  3296.       break;
  3297.   
  3298.        case 'T':
  3299.  
  3300. *** /usr/storm/nn6.3.0/news.h    Thu Jun  1 11:10:47 1989
  3301. --- news.h    Mon Jul  3 17:59:12 1989
  3302. ***************
  3303. *** 22,28 ****
  3304.       char    *ng_dist;    /*   distibution        */
  3305.       char    *ng_org;    /*   organization        */
  3306.       char    *ng_appr;    /*   approved            */
  3307.       char    *ng_date;    /*   date            */
  3308.       
  3309.       char    *ng_xlines;    /*   lines (from header)    */
  3310. --- 22,29 ----
  3311.       char    *ng_dist;    /*   distibution        */
  3312.       char    *ng_org;    /*   organization        */
  3313.       char    *ng_appr;    /*   approved            */
  3314. !     char    *ng_summ;    /*   summary            */
  3315. !     
  3316.       char    *ng_date;    /*   date            */
  3317.       
  3318.       char    *ng_xlines;    /*   lines (from header)    */
  3319.  
  3320. *** /usr/storm/nn6.3.3/nn.1    Fri Jun 30 11:30:58 1989
  3321. --- nn.1    Sat Jul  8 01:26:21 1989
  3322. ***************
  3323. *** 106,116 ****
  3324.   .I never
  3325.   mark unread articles as read.
  3326.   .TP
  3327.   \fInews.group\fP  or  \fIfile\fP  or  \fI+folder\fP 
  3328.   If none of these arguments are given, all subscribed news groups will
  3329.   be used.  Otherwise, only the specified news groups and/or files will
  3330.   be collected and presented.  In specifying a news groups, the
  3331. ! following `meta notation' can be used: If the news group ends with a
  3332.   \&`.' (or `.all'), all subgroups of the news group will be collected,
  3333.   e.g.
  3334.   .br
  3335. --- 106,125 ----
  3336.   .I never
  3337.   mark unread articles as read.
  3338.   .TP
  3339. + \-\fBX\fP    {\fIno corresponding variable\fP}
  3340. + Read/scan unsubscribed groups also.  Most useful when looking for
  3341. + a specific subject in \fBall\fP groups, e.g.
  3342. + .br
  3343. +    nn -mxX -sSubject all
  3344. + .br
  3345. + .TP
  3346.   \fInews.group\fP  or  \fIfile\fP  or  \fI+folder\fP 
  3347.   If none of these arguments are given, all subscribed news groups will
  3348.   be used.  Otherwise, only the specified news groups and/or files will
  3349.   be collected and presented.  In specifying a news groups, the
  3350. ! following `meta notation' can be used:
  3351. ! .br
  3352. ! If the news group ends with a
  3353.   \&`.' (or `.all'), all subgroups of the news group will be collected,
  3354.   e.g.
  3355.   .br
  3356. ***************
  3357. *** 121,127 ****
  3358.   .br
  3359.       \&.sources.unix
  3360.   .br
  3361. ! These notations cannot be mixed (yet)!
  3362.   .SH COMMAND INPUT
  3363.   In general, \fInn\fP commands consist of one or two key-strokes, and \fInn\fP
  3364.   reacts instantly to the commands you give it; you don't have to enter 
  3365. --- 130,136 ----
  3366.   .br
  3367.       \&.sources.unix
  3368.   .br
  3369. ! The argument `all' identifies all (subscribed) news groups.
  3370.   .SH COMMAND INPUT
  3371.   In general, \fInn\fP commands consist of one or two key-strokes, and \fInn\fP
  3372.   reacts instantly to the commands you give it; you don't have to enter 
  3373. ***************
  3374. *** 366,371 ****
  3375. --- 375,385 ----
  3376.   \&\fB+\fP    {\fBselect-auto\fP}
  3377.   Perform auto-selections in the group (see the section on "auto
  3378.   kill/select" below).
  3379. + .TP
  3380. + \&\fB=\fP    {\fBfind\fP}
  3381. + Prompts for a regular expression, and selects all articles on the menu
  3382. + (all pages) whose subject matches the regular expression.  An empty
  3383. + answer (\fB= return\fP) will reuse the previous expression.
  3384.   .LP
  3385.   During selection, the cursor will normally be placed on the article
  3386.   following the last selected article (initially the first article).
  3387. ***************
  3388. *** 563,569 ****
  3389.   in the group have been read as usual, these `left over' articles will
  3390.   be presented once more.  This is useful if you see an article which
  3391.   you may want to respond to unless one the following articles is
  3392. ! already saying what you intended to say.
  3393.   .TP
  3394.   \&\fBp\fP    {\fBprevious\fP}
  3395.   Goto previous article.
  3396. --- 577,584 ----
  3397.   in the group have been read as usual, these `left over' articles will
  3398.   be presented once more.  This is useful if you see an article which
  3399.   you may want to respond to unless one the following articles is
  3400. ! already saying what you intended to say.  The `left over' article is
  3401. ! marked with a `+' following the article id on the menu.
  3402.   .TP
  3403.   \&\fBp\fP    {\fBprevious\fP}
  3404.   Goto previous article.
  3405. ***************
  3406. *** 649,656 ****
  3407.   Skip the rest of the current article, and \fIpreview the next article\fP.
  3408.   .TP
  3409.   \&\fBl\fP    {\fBleave-article\fP}
  3410. ! Select the article on the menu, then skip the rest of the current
  3411. ! article, and preview the next article.
  3412.   .TP
  3413.   \&\fB%\fP\fIy\fP    {\fBpreview\fP}
  3414.   Preview article 
  3415. --- 664,673 ----
  3416.   Skip the rest of the current article, and \fIpreview the next article\fP.
  3417.   .TP
  3418.   \&\fBl\fP    {\fBleave-article\fP}
  3419. ! Mark the article as `left over' on the menu for handling later on.
  3420. ! Then skip the rest of the current 
  3421. ! article, and preview the next article.  The `left over' article is
  3422. ! marked with a `+' following the article id on the menu.
  3423.   .TP
  3424.   \&\fB%\fP\fIy\fP    {\fBpreview\fP}
  3425.   Preview article 
  3426. ***************
  3427. *** 1732,1737 ****
  3428. --- 1749,1760 ----
  3429.   \fBdebug\fP \fImask\fP    (integer, default 0)
  3430.   Look in the source if you are going to use this.
  3431.   .TP
  3432. + \fBdefault-distribution\fP \fIdistr\fP    (string, default not set)
  3433. + The distribution to use as the default suggestion when posting
  3434. + articles using the \fBpost\fP command.  If it is not set, the
  3435. + first component of the group name is used as the suggested
  3436. + distribution, e.g. `comp' when posting to comp.whatever.
  3437. + .TP
  3438.   \fBdefault-save-file\fP \fIfile\fP    (string, default +$F)
  3439.   The default save file used in quick save mode.  It can also be
  3440.   specified using the abbreviation "+" as the file name in normal save
  3441. ***************
  3442. *** 1832,1837 ****
  3443. --- 1855,1869 ----
  3444.   When set, \fInn\fP will save articles in a format that is compatible
  3445.   with normal mail folders.
  3446.   .TP
  3447. + \fBmail-header\fP \fIheaders\fP    (string, default not set)
  3448. + The \fIheaders\fP string specifies one or more extra header lines
  3449. + (separated by semi-colons `;') which are added to the header of mail
  3450. + sent from \fInn\fP using the \fBreply\fP and \fBmail\fP commands.  For
  3451. + example: 
  3452. + .br
  3453. +    set mail-header Reply-To: storm@texas.dk
  3454. + .br
  3455. + .TP
  3456.   \fBmail-record\fP \fIfile\fP    (string, default not set)
  3457.   \fIfile\fP must be a full path name of a file.  If defined, all replies and
  3458.   mail will be saved in this file in standard
  3459. ***************
  3460. *** 1850,1855 ****
  3461. --- 1882,1893 ----
  3462.   characters in the received messages using a "cat -v" like format.
  3463.   Otherwise, only the printable characters are shown (default).
  3464.   .TP
  3465. + \fBnews-header\fP \fIheaders\fP    (string, default not set)
  3466. + The \fIheaders\fP string specifies one or more extra header lines
  3467. + (separated by semi-colons `;') which are added to the header of
  3468. + articles posted from \fInn\fP using the \fBfollow\fP and \fBpost\fP
  3469. + commands.
  3470. + .TP
  3471.   \fBnews-record\fP \fIfile\fP    (string, default not set)
  3472.   Save file for follow-ups and postings.  Same rules and format as the
  3473.   \fBmail-record\fP variable.
  3474. ***************
  3475. *** 2029,2034 ****
  3476. --- 2067,2074 ----
  3477.   \fBW\fP    Followup-To:
  3478.   .br
  3479.   \fBX\fP    References:
  3480. + .br
  3481. + \fBY\fP    Summary:
  3482.   .in -8n
  3483.   .DT
  3484.   .LP
  3485. ***************
  3486. *** 2153,2158 ****
  3487. --- 2193,2205 ----
  3488.   read articles.  This will 
  3489.   .I never
  3490.   mark unread articles as read.
  3491. + .TP
  3492. + \-\fBX\fP    {\fIno corresponding variable\fP}
  3493. + Read/scan unsubscribed groups also.  Most useful when looking for
  3494. + a specific subject in all groups, e.g.
  3495. + .br
  3496. +    nn -mxX -sSubject all
  3497. + .br
  3498.   .SH KEY MAPPINGS
  3499.   The descriptions of the keys and commands provided in this manual
  3500.   reflects the default key mappings in \fInn\fP.  However, you can
  3501. ***************
  3502. *** 2304,2310 ****
  3503.   .br
  3504.   \fBcontinue\fP    \fBspace\fP     \fBspace\fP 
  3505.   .br
  3506. ! \fBfind\fP    \fBnix\fP     / 
  3507.   .br
  3508.   \fBfind-next\fP    \fBnix\fP     . 
  3509.   .br
  3510. --- 2351,2357 ----
  3511.   .br
  3512.   \fBcontinue\fP    \fBspace\fP     \fBspace\fP 
  3513.   .br
  3514. ! \fBfind\fP    =     / 
  3515.   .br
  3516.   \fBfind-next\fP    \fBnix\fP     . 
  3517.   .br
  3518.  
  3519. *** /usr/storm/nn6.3.0/nn.c    Thu Jun  1 11:10:57 1989
  3520. --- nn.c    Sat Jul  8 01:26:22 1989
  3521. ***************
  3522. *** 30,35 ****
  3523. --- 30,36 ----
  3524.       show_article_date, first_page_lines,            /* more.c */
  3525.       dont_split_digests, dont_sort_articles,            /* group.c */
  3526.       dont_sort_folders,                        /* folder.c */
  3527. +     also_unsub_groups,                        /* sequence.c*/
  3528.       show_current_time, conf_dont_sleep;                /* term.c */
  3529.   
  3530.   Option_Description(nn_options) {
  3531. ***************
  3532. *** 52,57 ****
  3533. --- 53,59 ----
  3534.       'w', Int_Option_Optional(preview_window, 5),
  3535.       'W', Bool_Option(conf_dont_sleep),
  3536.       'x', Int_Option_Optional(also_read_articles, -1),
  3537. +     'X', Bool_Option(also_unsub_groups),
  3538.       'Z', Int_Option(Debug),
  3539.       '\0',
  3540.   };
  3541. ***************
  3542. *** 84,98 ****
  3543.       extern long unread_articles;
  3544.       extern char *program_name();
  3545.       int emacs_slave_mode = 0, check_news = 0, enter_admin_mode = 0;
  3546.       pname = program_name(argv);
  3547. !     if (strcmp(pname, "nnadmin") == 0)
  3548.       enter_admin_mode = 1;
  3549. !     else
  3550.       if (strcmp(pname, "nnemacs") == 0)
  3551.       emacs_slave_mode = 1;
  3552.       else
  3553.       if (strcmp(pname, "nncheck") == 0) {
  3554.       keep_rc_backup = 0;    
  3555.       check_news = 1;
  3556.       }
  3557. --- 86,103 ----
  3558.       extern long unread_articles;
  3559.       extern char *program_name();
  3560.       int emacs_slave_mode = 0, check_news = 0, enter_admin_mode = 0;
  3561. !     int who_am_i = 0;
  3562. !     
  3563.       pname = program_name(argv);
  3564. !     if (strcmp(pname, "nnadmin") == 0) {
  3565. !     who_am_i = 2;
  3566.       enter_admin_mode = 1;
  3567. !     } else
  3568.       if (strcmp(pname, "nnemacs") == 0)
  3569.       emacs_slave_mode = 1;
  3570.       else
  3571.       if (strcmp(pname, "nncheck") == 0) {
  3572. +     who_am_i = 3;
  3573.       keep_rc_backup = 0;    
  3574.       check_news = 1;
  3575.       }
  3576. ***************
  3577. *** 103,109 ****
  3578.           nn_exit(1);
  3579.       }
  3580.       
  3581. !     init_global(0);
  3582.       init_key_map();
  3583.       init_execute();
  3584.       init_macro();
  3585. --- 108,118 ----
  3586.           nn_exit(1);
  3587.       }
  3588.       
  3589. !     if (init_global(who_am_i) < 0) {
  3590. !     fprintf(stderr, "%s: nn has not been invoked to initialize user files\n", pname);
  3591. !     nn_exit(1);
  3592. !     }
  3593. !     
  3594.       init_key_map();
  3595.       init_execute();
  3596.       init_macro();
  3597. ***************
  3598. *** 209,217 ****
  3599.       }
  3600.   
  3601.       if (prompt_for_group) {
  3602.       raw();
  3603.       current_group = NULL;
  3604. !     prompt_line = Lines - 1;
  3605.       goto_group(K_GOTO_GROUP, (article_header *)NULL);
  3606.       no_raw();
  3607.       clrdisp();
  3608. --- 218,227 ----
  3609.       }
  3610.   
  3611.       if (prompt_for_group) {
  3612. +     printf("\r\n\n"); 
  3613.       raw();
  3614.       current_group = NULL;
  3615. !     prompt_line = Lines - 3;
  3616.       goto_group(K_GOTO_GROUP, (article_header *)NULL);
  3617.       no_raw();
  3618.       clrdisp();
  3619. ***************
  3620. *** 276,281 ****
  3621. --- 286,293 ----
  3622.       
  3623.       if (loop) exit(n);
  3624.       loop++;
  3625. +     unset_raw();
  3626.       
  3627.   #ifdef NNTP
  3628.       nntp_cleanup();
  3629. ***************
  3630. *** 352,358 ****
  3631.           cur->last_l_article = 0;
  3632.           }
  3633.       } else
  3634. !         menu_cmd = group_menu(cur, -1, 
  3635.                     match_subject, do_kill_handling, menu);
  3636.   
  3637.       if (menu_cmd != ME_NO_ARTICLES)
  3638. --- 364,370 ----
  3639.           cur->last_l_article = 0;
  3640.           }
  3641.       } else
  3642. !         menu_cmd = group_menu(cur, (article_number)(-1), 
  3643.                     match_subject, do_kill_handling, menu);
  3644.   
  3645.       if (menu_cmd != ME_NO_ARTICLES)
  3646.  
  3647. *** /usr/storm/nn6.3.2/rc.c    Wed Jun 28 20:08:07 1989
  3648. --- rc.c    Wed Jul  5 14:53:09 1989
  3649. ***************
  3650. *** 186,191 ****
  3651. --- 186,197 ----
  3652.           gh->group_flag |= G_SUBSCRIPTION | G_NEW;
  3653.   
  3654.       gh->last_article = LASTART(line);
  3655. +     if (gh->group_flag & G_BLOCKED) {
  3656. +         /* We cannot trust this group, so we leave it alone */
  3657. +         /* group_menu after update_group will do what is necessary */
  3658. +         continue;
  3659. +     }
  3660.       
  3661.       if (gh->last_article > gh->last_l_article)
  3662.           gh->group_flag |= G_RENUM;    /* mark for use below */
  3663. ***************
  3664. *** 420,426 ****
  3665.   int mode;    /* +1 => add, -1 => subtract */
  3666.   {
  3667.       long art;
  3668. !     int was_unread;
  3669.       
  3670.       art = gh->last_l_article - gh->last_article;
  3671.       was_unread = (gh->group_flag & G_UNREAD_COUNT);
  3672. --- 426,432 ----
  3673.   int mode;    /* +1 => add, -1 => subtract */
  3674.   {
  3675.       long art;
  3676. !     int32 was_unread;
  3677.       
  3678.       art = gh->last_l_article - gh->last_article;
  3679.       was_unread = (gh->group_flag & G_UNREAD_COUNT);
  3680.  
  3681. *** /usr/storm/nn6.3.3/save.c    Fri Jun 30 11:31:09 1989
  3682. --- save.c    Wed Jul  5 17:00:28 1989
  3683. ***************
  3684. *** 259,265 ****
  3685.       
  3686.   #ifdef PAGED_OUTPUT
  3687.       if (save_mode & DO_UNSHAR) {
  3688. !     int was_raw = no_raw();
  3689.       pager_stream = popen(pager, "w");
  3690.       if (was_raw) raw();
  3691.       
  3692. --- 259,265 ----
  3693.       
  3694.   #ifdef PAGED_OUTPUT
  3695.       if (save_mode & DO_UNSHAR) {
  3696. !     int was_raw = unset_raw();
  3697.       pager_stream = popen(pager, "w");
  3698.       if (was_raw) raw();
  3699.       
  3700. ***************
  3701. *** 329,335 ****
  3702.           fclose(art);
  3703.           return 0;
  3704.           }
  3705. !         was_raw = no_raw();
  3706.           if (save_name) 
  3707.   #ifdef PAGED_OUTPUT
  3708.           sprintf(copybuf, "cd %s && %s %s", save_name, unshar_cmd, pager_redir);
  3709. --- 329,335 ----
  3710.           fclose(art);
  3711.           return 0;
  3712.           }
  3713. !         was_raw = unset_raw();
  3714.           if (save_name) 
  3715.   #ifdef PAGED_OUTPUT
  3716.           sprintf(copybuf, "cd %s && %s %s", save_name, unshar_cmd, pager_redir);
  3717. ***************
  3718. *** 383,389 ****
  3719.       }
  3720.   
  3721.       if (mode == FULL_HEADER) {
  3722. !     int cnt = ah->fpos - ah->hpos;
  3723.       while (--cnt >= 0) {
  3724.           if ((c = getc(art)) == EOF) break;
  3725.           putc(c, save_file);
  3726. --- 383,389 ----
  3727.       }
  3728.   
  3729.       if (mode == FULL_HEADER) {
  3730. !     off_t cnt = ah->fpos - ah->hpos;
  3731.       while (--cnt >= 0) {
  3732.           if ((c = getc(art)) == EOF) break;
  3733.           putc(c, save_file);
  3734.  
  3735. *** /usr/storm/nn6.3.2/selection.c    Wed Jun 28 20:08:10 1989
  3736. --- selection.c    Sat Jul  8 16:21:37 1989
  3737. ***************
  3738. *** 5,11 ****
  3739.   #include "config.h"
  3740.   #include "articles.h"
  3741.   
  3742. ! #define    SLMAGIC    0x536c6374
  3743.   #define GNAME_LGT 32
  3744.   
  3745.   static struct sel_header {
  3746. --- 5,11 ----
  3747.   #include "config.h"
  3748.   #include "articles.h"
  3749.   
  3750. ! #define    SLMAGIC    0x536c6375
  3751.   #define GNAME_LGT 32
  3752.   
  3753.   static struct sel_header {
  3754. ***************
  3755. *** 35,47 ****
  3756.   };
  3757.   
  3758.   
  3759. ! save_selection(gh, first, last)
  3760.   group_header *gh;
  3761.   article_number first, last;
  3762.   {
  3763.       register article_header *ah, **ahp;
  3764. !     register int art;
  3765. !     register int save_count, seen_count, flags;
  3766.       struct sel_art elem;
  3767.       FILE *f;
  3768.       char buffer[16];
  3769. --- 35,49 ----
  3770.   };
  3771.   
  3772.   
  3773. ! save_selection(gh, first, last, type)
  3774.   group_header *gh;
  3775.   article_number first, last;
  3776. + int type;
  3777.   {
  3778.       register article_header *ah, **ahp;
  3779. !     register article_number art;
  3780. !     register int save_count, seen_count;
  3781. !     register int32 flags, save_flags;
  3782.       struct sel_art elem;
  3783.       FILE *f;
  3784.       char buffer[16];
  3785. ***************
  3786. *** 48,57 ****
  3787.   
  3788.       if (gh->group_flag & (G_FOLDER | G_READ)) return;
  3789.   
  3790.       for (save_count = seen_count = 0, art = n_articles; --art >= 0; ) {
  3791.       flags = articles[art]->flag; 
  3792.       if (flags & A_SEEN) seen_count++;
  3793. !     if (flags & A_SELECT) save_count++;
  3794.       }
  3795.       
  3796.       if (save_count == 0 && 
  3797. --- 50,66 ----
  3798.   
  3799.       if (gh->group_flag & (G_FOLDER | G_READ)) return;
  3800.   
  3801. +     save_flags = A_LEAVE | A_LEAVE_NEXT;
  3802. +     if (type == 0) save_flags |= A_READ;
  3803. +     
  3804.       for (save_count = seen_count = 0, art = n_articles; --art >= 0; ) {
  3805.       flags = articles[art]->flag; 
  3806.       if (flags & A_SEEN) seen_count++;
  3807. !     if (flags & A_KILL) continue;
  3808. !     /* we count only the non-auto selected articles, */
  3809. !     /* but we still save all selections later if save_count > 0 */
  3810. !     if ((flags & save_flags) || (flags & (A_SELECT | A_AUTO)) == A_SELECT)
  3811. !         save_count++;
  3812.       }
  3813.       
  3814.       if (save_count == 0 && 
  3815. ***************
  3816. *** 66,84 ****
  3817.       header.sl_first = htonl(first);
  3818.       header.sl_last  = htonl(last);
  3819.       
  3820. !     fwrite(&header, sizeof(header), 1, f);
  3821.   
  3822.       unsort_articles(1);
  3823.       
  3824.       for (ahp = articles, art = 0; art < n_articles; ahp++, art++) {
  3825.       ah = *ahp;
  3826. !     if (elem.sl_flag = htonl(ah->flag & (A_SELECT | A_SEEN))) {
  3827. !         
  3828. !         elem.sl_number = htonl(ah->a_number);
  3829. !         elem.sl_fpos   = htonl(ah->fpos);
  3830. !         
  3831. !         fwrite(&elem, sizeof(elem), 1, f);
  3832.       }
  3833.       }
  3834.       
  3835.       fclose(f);
  3836. --- 75,104 ----
  3837.       header.sl_first = htonl(first);
  3838.       header.sl_last  = htonl(last);
  3839.       
  3840. !     fwrite((char *)&header, sizeof(header), 1, f);
  3841.   
  3842.       unsort_articles(1);
  3843.       
  3844.       for (ahp = articles, art = 0; art < n_articles; ahp++, art++) {
  3845.       ah = *ahp;
  3846. !     switch (type) {
  3847. !      case 0:        /* save current selection */
  3848. !         break;
  3849. !      case 1:        /* mark seen as read */
  3850. !         if (ah->flag & (A_READ | A_SEEN)) continue;
  3851. !         break;
  3852. !      case 2:        /* leave seen articles unread */
  3853. !         if (ah->flag & A_READ) continue;
  3854. !         ah->flag &= ~A_SEEN;
  3855. !         break;
  3856.       }
  3857. +     if (ah->flag & A_LEAVE_NEXT) ah->flag |= A_LEAVE;
  3858. +     elem.sl_flag = htonl(ah->flag & (A_SELECT | A_SEEN | A_LEAVE | A_READ));
  3859. +     elem.sl_number = htonl(ah->a_number);
  3860. +     elem.sl_fpos   = htonl(ah->fpos);
  3861. +         
  3862. +     fwrite((char *)&elem, sizeof(elem), 1, f);
  3863.       }
  3864.       
  3865.       fclose(f);
  3866. ***************
  3867. *** 102,108 ****
  3868.       f = open_file(relative(nn_directory, buffer), OPEN_READ|OPEN_UNLINK);
  3869.       if (f == NULL) return 0;
  3870.   
  3871. !     if (fread(&header, sizeof(header), 1, f) != 1
  3872.       || ntohl(header.sl_magic) != SLMAGIC
  3873.       || strncmp(header.sl_group, gh->group_name, GNAME_LGT)) {
  3874.       fclose(f);
  3875. --- 122,128 ----
  3876.       f = open_file(relative(nn_directory, buffer), OPEN_READ|OPEN_UNLINK);
  3877.       if (f == NULL) return 0;
  3878.   
  3879. !     if (fread((char *)&header, sizeof(header), 1, f) != 1
  3880.       || ntohl(header.sl_magic) != SLMAGIC
  3881.       || strncmp(header.sl_group, gh->group_name, GNAME_LGT)) {
  3882.       fclose(f);
  3883. ***************
  3884. *** 138,145 ****
  3885.       register long art;
  3886.       struct sel_art elem;
  3887.       register article_header *ah, **ahp;
  3888. !     if (!ok) goto out;
  3889.       
  3890.       elem.sl_number = -1;
  3891.       
  3892. --- 158,169 ----
  3893.       register long art;
  3894.       struct sel_art elem;
  3895.       register article_header *ah, **ahp;
  3896. !     int do_elim = 0;
  3897. !     
  3898. !     if (!ok) {
  3899. !     fclose(sel_file);
  3900. !     return;
  3901. !     }
  3902.       
  3903.       elem.sl_number = -1;
  3904.       
  3905. ***************
  3906. *** 149,155 ****
  3907.       if (ah->a_number > header.sl_last) break;
  3908.       
  3909.       while (ah->a_number > elem.sl_number) {
  3910. !         if (fread(&elem, sizeof(elem), 1, sel_file) != 1) goto out;
  3911.   #ifndef NETWORK_BYTE_ORDER
  3912.           elem.sl_number = ntohl(elem.sl_number);
  3913.   #endif
  3914. --- 173,179 ----
  3915.       if (ah->a_number > header.sl_last) break;
  3916.       
  3917.       while (ah->a_number > elem.sl_number) {
  3918. !         if (fread((char *)&elem, sizeof(elem), 1, sel_file) != 1) goto out;
  3919.   #ifndef NETWORK_BYTE_ORDER
  3920.           elem.sl_number = ntohl(elem.sl_number);
  3921.   #endif
  3922. ***************
  3923. *** 159,165 ****
  3924.       elem.sl_fpos = ntohl(elem.sl_fpos);
  3925.   #endif
  3926.       while (ah->a_number == elem.sl_number && ah->fpos > elem.sl_fpos) {
  3927. !         if (fread(&elem, sizeof(elem), 1, sel_file) != 1) goto out;
  3928.   #ifndef NETWORK_BYTE_ORDER
  3929.           elem.sl_number = ntohl(elem.sl_number);
  3930.           elem.sl_fpos = ntohl(elem.sl_fpos);
  3931. --- 183,189 ----
  3932.       elem.sl_fpos = ntohl(elem.sl_fpos);
  3933.   #endif
  3934.       while (ah->a_number == elem.sl_number && ah->fpos > elem.sl_fpos) {
  3935. !         if (fread((char *)&elem, sizeof(elem), 1, sel_file) != 1) goto out;
  3936.   #ifndef NETWORK_BYTE_ORDER
  3937.           elem.sl_number = ntohl(elem.sl_number);
  3938.           elem.sl_fpos = ntohl(elem.sl_fpos);
  3939. ***************
  3940. *** 166,179 ****
  3941.   #endif
  3942.       }
  3943.       
  3944. !     if (ah->a_number != elem.sl_number || ah->fpos != elem.sl_fpos) 
  3945.           continue;
  3946. !     
  3947.       ah->flag |= ntohl(elem.sl_flag);
  3948.       }
  3949.       
  3950.   out:
  3951. !     
  3952.       fclose(sel_file);
  3953.   }
  3954.   
  3955. --- 190,213 ----
  3956.   #endif
  3957.       }
  3958.       
  3959. !     if (ah->a_number != elem.sl_number || ah->fpos != elem.sl_fpos) {
  3960. !         ah->flag |= A_KILL;
  3961. !         do_elim = 1;
  3962.           continue;
  3963. !     }    
  3964.       ah->flag |= ntohl(elem.sl_flag);
  3965.       }
  3966.       
  3967.   out:
  3968. !     for ( ; art < n_articles ; art++) {
  3969. !     ah = *ahp++;
  3970. !     if (ah->a_number > header.sl_last) break;
  3971. !     ah->flag |= A_KILL;
  3972. !     do_elim = 1;
  3973. !     }
  3974. !     
  3975. !     if (do_elim) elim_articles((article_number *)NULL, 0);
  3976. !     
  3977.       fclose(sel_file);
  3978.   }
  3979.   
  3980.  
  3981. *** /usr/storm/nn6.3.2/sequence.c    Wed Jun 28 20:08:11 1989
  3982. --- sequence.c    Sat Jul  8 01:26:22 1989
  3983. ***************
  3984. *** 7,12 ****
  3985. --- 7,13 ----
  3986.   
  3987.   export group_header *group_sequence;
  3988.   export char *read_mail = NULL;
  3989. + export int also_unsub_groups = 0;
  3990.   
  3991.   static int seq_break_enabled = 1;    /* !! enabled */
  3992.   
  3993. ***************
  3994. *** 77,83 ****
  3995.       found = 0;
  3996.       start_group_search(group);
  3997.       while (gh = get_group_search()) {
  3998. !         if ((gh->group_flag & G_SUBSCRIPTION) == 0) continue;
  3999.           found++;
  4000.           enter_normal(gh);
  4001.       }
  4002. --- 78,85 ----
  4003.       found = 0;
  4004.       start_group_search(group);
  4005.       while (gh = get_group_search()) {
  4006. !         if ((gh->group_flag & G_SUBSCRIPTION) == 0 && !also_unsub_groups)
  4007. !         continue;
  4008.           found++;
  4009.           enter_normal(gh);
  4010.       }
  4011. ***************
  4012. *** 117,123 ****
  4013.       Loop_Groups_Sorted(gh) {
  4014.       if (gh->group_flag & G_DONE) continue;
  4015.       
  4016. !     if ((gh->group_flag & G_SUBSCRIPTION) == 0) continue;
  4017.   
  4018.       enter_normal(gh);
  4019.       }
  4020. --- 119,126 ----
  4021.       Loop_Groups_Sorted(gh) {
  4022.       if (gh->group_flag & G_DONE) continue;
  4023.       
  4024. !     if ((gh->group_flag & G_SUBSCRIPTION) == 0 && !also_unsub_groups)
  4025. !         continue;
  4026.   
  4027.       enter_normal(gh);
  4028.       }
  4029. ***************
  4030. *** 301,307 ****
  4031.           gh->save_file = dflt_save;
  4032.           
  4033.           if (group_name_args == 0 &&
  4034. !         (gh->group_flag & G_SUBSCRIPTION) == 0) continue;
  4035.   
  4036.   #ifdef SEQ_TEST
  4037.           if (Debug & SEQ_TEST && mode != SHOW_NORMAL)
  4038. --- 304,311 ----
  4039.           gh->save_file = dflt_save;
  4040.           
  4041.           if (group_name_args == 0 &&
  4042. !         (gh->group_flag & G_SUBSCRIPTION) == 0 && !also_unsub_groups)
  4043. !         continue;
  4044.   
  4045.   #ifdef SEQ_TEST
  4046.           if (Debug & SEQ_TEST && mode != SHOW_NORMAL)
  4047. ***************
  4048. *** 364,370 ****
  4049.       group_header *gh;
  4050.       
  4051.       gh = (group_header *)calloc(1, sizeof(group_header));
  4052. !     mem_check(gh, 1, "group header");
  4053.       
  4054.       gh->group_name = name;
  4055.       gh->group_flag = flag | G_READ;
  4056. --- 368,374 ----
  4057.       group_header *gh;
  4058.       
  4059.       gh = (group_header *)calloc(1, sizeof(group_header));
  4060. !     mem_check((char *)gh, 1, "group header");
  4061.       
  4062.       gh->group_name = name;
  4063.       gh->group_flag = flag | G_READ;
  4064. ***************
  4065. *** 384,389 ****
  4066. --- 388,394 ----
  4067.   #define    GS_SUFFIX    2    /* .group */
  4068.   #define GS_INFIX    3    /* .group. */
  4069.   #define GS_NEW_GROUP    4    /* new group */
  4070. + #define GS_ALL        5    /* all / . */
  4071.   
  4072.   static start_group_search(group)
  4073.   char *group;
  4074. ***************
  4075. *** 393,398 ****
  4076. --- 398,407 ----
  4077.       if (strcmp(group, "NEW") == 0) {
  4078.       gs_mode = GS_NEW_GROUP;
  4079.       gs_length = 0;
  4080. +     } else 
  4081. +     if (strcmp(group, "all") == 0 || strcmp(group, ".") == 0) {
  4082. +     gs_mode = GS_ALL;
  4083. +     gs_length = 0;
  4084.       } else {
  4085.       gs_mode = GS_PREFIX;
  4086.       
  4087. ***************
  4088. *** 446,451 ****
  4089. --- 455,463 ----
  4090.           
  4091.        case GS_INFIX:
  4092.           user_error(".name. notation not supported (yet)");
  4093. +         break;
  4094. +      case GS_ALL:
  4095.           break;
  4096.       }
  4097.   
  4098.  
  4099. *** /usr/storm/nn6.3.3/term.c    Fri Jun 30 11:31:10 1989
  4100. --- term.c    Wed Jul  5 16:52:18 1989
  4101. ***************
  4102. *** 20,25 ****
  4103. --- 20,26 ----
  4104.   export int  prompt_length;
  4105.   export int  slow_mode = 0;
  4106.   export int  any_message = 0;
  4107. + export int  flow_control = 1;
  4108.   
  4109.   export char help_key = '?';
  4110.   export char comp1_key = SP;
  4111. ***************
  4112. *** 36,41 ****
  4113. --- 37,44 ----
  4114.   
  4115.   #define HAS_CAP(str) (str && *str)
  4116.   
  4117. + extern char *tgoto();        /* some systems don't have this in term.h */
  4118.   #else
  4119.   
  4120.   #define USE_TERMCAP
  4121. ***************
  4122. *** 233,239 ****
  4123.   #endif
  4124.       
  4125.   #ifdef USE_TERMINFO
  4126. !     setupterm(0,1,0);
  4127.       Columns = columns;
  4128.       Lines = lines;
  4129.       cookie_size = magic_cookie_glitch;
  4130. --- 236,242 ----
  4131.   #endif
  4132.       
  4133.   #ifdef USE_TERMINFO
  4134. !     setupterm((char *)NULL, 1, (int *)NULL);
  4135.       Columns = columns;
  4136.       Lines = lines;
  4137.       cookie_size = magic_cookie_glitch;
  4138. ***************
  4139. *** 521,529 ****
  4140. --- 524,538 ----
  4141.   }
  4142.   
  4143.   static int is_raw = 0;
  4144. + static int must_set_raw = 1;
  4145.   
  4146.   raw()
  4147.   {
  4148. +     if (!flow_control) {
  4149. +     if (!must_set_raw) return;
  4150. +     must_set_raw = 0;
  4151. +     }
  4152. +     
  4153.       if (is_raw) return;
  4154.   
  4155.   #ifdef HAVE_TERMIO
  4156. ***************
  4157. *** 536,541 ****
  4158. --- 545,552 ----
  4159.   
  4160.   no_raw()
  4161.   {
  4162. +     if (!flow_control) return 0;
  4163. +     
  4164.       if (!is_raw) return 0;
  4165.   
  4166.   #ifdef HAVE_TERMIO
  4167. ***************
  4168. *** 546,551 ****
  4169. --- 557,575 ----
  4170.       is_raw = 0;
  4171.   
  4172.       return 1;
  4173. + }
  4174. + unset_raw()
  4175. + {
  4176. +     int oflow = flow_control;
  4177. +     int was_raw;
  4178. +     
  4179. +     flow_control = 1;
  4180. +     was_raw = no_raw();
  4181. +     flow_control = oflow;
  4182. +     if (!flow_control)
  4183. +     must_set_raw = 1;
  4184. +     return was_raw;
  4185.   }
  4186.   
  4187.   flush_input()
  4188.  
  4189. *** /usr/storm/nn6.3.0/term.h    Thu Jun  1 11:11:03 1989
  4190. --- term.h    Wed Jul  5 14:58:50 1989
  4191. ***************
  4192. *** 25,30 ****
  4193. --- 25,45 ----
  4194.   
  4195.   extern get_c();
  4196.   
  4197. + /* special keys returned by get_c() */
  4198. + #define    K_interrupt    CTRL('G')
  4199. + #define    K_up_arrow    0x0081
  4200. + #define    K_down_arrow    0x0082
  4201. + #define K_left_arrow    0x0083
  4202. + #define K_right_arrow    0x0084
  4203. + #define    K_function(n)    (0x0085 + n)
  4204. + #define    GETC_COMMAND    0x4000    /* bit set by get_c to return a command */
  4205.   /*
  4206.    *    prompt_line = ...
  4207.    *    prompt( [P_COMMAND], ] [ format [, arg1 ... , arg4] ] );
  4208.  
  4209. *** /usr/storm/nn6.3.3/variable.c    Fri Jun 30 11:31:12 1989
  4210. --- variable.c    Mon Jul 10 11:33:52 1989
  4211. ***************
  4212. *** 7,13 ****
  4213. --- 7,16 ----
  4214.   import in_init;
  4215.   
  4216.   import char            /* string variables */
  4217. +     *default_distribution,
  4218.       *default_save_file,
  4219. +     *extra_mail_headers,
  4220. +     *extra_news_headers,
  4221.       *header_lines,
  4222.       *folder_directory,
  4223.       included_mark[],
  4224. ***************
  4225. *** 14,22 ****
  4226.       *mail_box,
  4227.       *mail_record,
  4228.       *news_record,
  4229. - #ifdef NNTP
  4230. -     nntp_server[],
  4231. - #endif
  4232.       *pager,
  4233.       *patch_cmd,
  4234.       printer[],
  4235. --- 17,22 ----
  4236. ***************
  4237. *** 31,42 ****
  4238. --- 31,45 ----
  4239.       dont_sort_articles,
  4240.       dont_sort_folders,
  4241.       dont_split_digests,
  4242. +     flow_control,
  4243.       fmt_rptsubj,
  4244. +     include_art_id,
  4245.       keep_rc_backup,
  4246.       long_menu,
  4247.       macro_debug,
  4248.       mark_overlap,
  4249.       monitor_mode,
  4250. +     nn_re_style,
  4251.       novice,
  4252.       quick_save,
  4253.       save_report,
  4254. ***************
  4255. *** 85,98 ****
  4256. --- 88,104 ----
  4257.       "cross-post",    V_BOOLEAN,    0,    (char **)&also_cross_postings,
  4258.       "date",        V_BOOLEAN,    0,    (char **)&show_article_date,
  4259.       "debug",        V_INTEGER,    0,    (char **)&Debug,
  4260. +     "default-distribution",V_STRING,    0,    (char **)&default_distribution,
  4261.       "default-save-file",V_STRING,    0,    (char **)&default_save_file,
  4262.       "delay-redraw",    V_BOOLEAN,    0,    (char **)&delay_redraw,
  4263.       "erase-key",    V_KEY,        0,    (char **)&erase_key,
  4264.       "expert",        V_BOOLEAN,    4,    (char **)&novice,
  4265. +     "flow-control",    V_BOOLEAN,    0,    (char **)&flow_control,
  4266.       "folder",        V_STRING,    2,    (char **)&folder_directory,
  4267.       "fsort",        V_BOOLEAN,    2,    (char **)&dont_sort_folders,
  4268.       "header-lines",    V_STRING,    0,    (char **)&header_lines,
  4269.       "help-key",        V_KEY,        0,    (char **)&help_key,
  4270. +     "include-art-id",    V_BOOLEAN,    0,    (char **)&include_art_id,
  4271.       "included-mark",    V_STRING,    1,    (char **)included_mark,
  4272.       "kill",        V_BOOLEAN,    0,    (char **)&do_kill_handling,
  4273.       "kill-key",        V_KEY,        0,    (char **)&kill_key,
  4274. ***************
  4275. *** 103,116 ****
  4276.       "macro-debug",    V_BOOLEAN,    0,    (char **)¯o_debug,
  4277.       "mail",        V_STRING,    0,    (char **)&mail_box,
  4278.       "mail-format",    V_BOOLEAN,    0,    (char **)&use_mail_folders,
  4279.       "mail-record",    V_STRING,    2,    (char **)&mail_record,
  4280.       "mark-overlap",    V_BOOLEAN,    0,    (char **)&mark_overlap,
  4281.       "monitor",        V_BOOLEAN,    0,    (char **)&monitor_mode,
  4282.       "news-record",    V_STRING,    2,    (char **)&news_record,
  4283.       "newsrc",        V_BOOLEAN,    0,    (char **)&use_newsrc,
  4284. ! #ifdef NNTP
  4285. !     "nntp-server",    V_STRING,    1,    (char **)nntp_server,
  4286. ! #endif
  4287.       "old",        V_SPECIAL,    2,    (char **)NULL,
  4288.       "overlap",        V_INTEGER,    0,    (char **)&overlap,
  4289.       "pager",        V_STRING,    0,    (char **)&pager,
  4290. --- 109,122 ----
  4291.       "macro-debug",    V_BOOLEAN,    0,    (char **)¯o_debug,
  4292.       "mail",        V_STRING,    0,    (char **)&mail_box,
  4293.       "mail-format",    V_BOOLEAN,    0,    (char **)&use_mail_folders,
  4294. +     "mail-header",    V_STRING,    0,    (char **)&extra_mail_headers,
  4295.       "mail-record",    V_STRING,    2,    (char **)&mail_record,
  4296.       "mark-overlap",    V_BOOLEAN,    0,    (char **)&mark_overlap,
  4297.       "monitor",        V_BOOLEAN,    0,    (char **)&monitor_mode,
  4298. +     "news-header",    V_STRING,    0,    (char **)&extra_news_headers,
  4299.       "news-record",    V_STRING,    2,    (char **)&news_record,
  4300.       "newsrc",        V_BOOLEAN,    0,    (char **)&use_newsrc,
  4301. !     "nn-re-style",    V_BOOLEAN,    0,    (char **)&nn_re_style,
  4302.       "old",        V_SPECIAL,    2,    (char **)NULL,
  4303.       "overlap",        V_INTEGER,    0,    (char **)&overlap,
  4304.       "pager",        V_STRING,    0,    (char **)&pager,
  4305. ***************
  4306. *** 171,177 ****
  4307.   int on;
  4308.   char *val_string;
  4309.   {
  4310. !     long value;
  4311.       register struct variable_defs *var;
  4312.   
  4313.       if (strncmp(variable, "no", 2) == 0) {
  4314. --- 177,183 ----
  4315.   int on;
  4316.   char *val_string;
  4317.   {
  4318. !     int value;
  4319.       register struct variable_defs *var;
  4320.   
  4321.       if (strncmp(variable, "no", 2) == 0) {
  4322. ***************
  4323. *** 185,191 ****
  4324.       if (!on || val_string == NULL)
  4325.       value = 0;
  4326.       else    
  4327. !     value = atol(val_string);
  4328.   
  4329.       switch (var->var_type) {
  4330.       
  4331. --- 191,197 ----
  4332.       if (!on || val_string == NULL)
  4333.       value = 0;
  4334.       else    
  4335. !     value = atoi(val_string);
  4336.   
  4337.       switch (var->var_type) {
  4338.       
  4339.  
  4340. *** /usr/storm/nn6.3.3/xmakefile    Fri Jun 30 11:31:13 1989
  4341. --- xmakefile    Mon Jul 10 11:40:15 1989
  4342. ***************
  4343. *** 182,258 ****
  4344.   cvt-help:    cvt-help.c
  4345.       cc -o cvt-help cvt-help.c
  4346.   
  4347. ! active.o:    active.c config.h global.h data.h
  4348. ! admin.o:    admin.c config.h global.h data.h term.h db.h
  4349. ! answer.o:    answer.c config.h global.h data.h news.h term.h keymap.h
  4350. ! articles.o:    articles.c config.h global.h data.h articles.h db.h match.h
  4351. ! collect.o:    collect.c config.h global.h data.h db.h news.h
  4352. ! date_regexp.o:    config.h global.h data.h
  4353. ! db.o:        db.c config.h global.h data.h db.h
  4354. ! decode.o:    decode.c config.h
  4355. ! digest.o:    digest.c config.h global.h data.h news.h match.h
  4356. ! execute.o:    execute.c config.h global.h data.h term.h
  4357. ! expire.o:    expire.c config.h global.h data.h
  4358. ! folder.o:    folder.c config.h global.h data.h articles.h news.h term.h menu.h
  4359. ! global.o:    global.c config.h global.h data.h
  4360. ! group.o:    group.c config.h global.h data.h articles.h db.c term.h menu.h keymap.h
  4361. ! init.o:        init.c config.h global.h data.h articles.h keymap.h term.h menu.h 
  4362. ! keymap.o:    keymap.c config.h global.h data.h keymap.h term.h
  4363. ! kill.o:        kill.c config.h global.h data.h term.h
  4364.   log_entry.o:    log_entry.c
  4365. ! master.o:    master.c config.h global.h data.h
  4366. ! menu.o:        menu.c config.h global.h data.h articles.h term.h menu.h keymap.h
  4367. ! more.o:        more.c config.h global.h data.h news.h term.h menu.h keymap.h
  4368. ! news.o:        news.c config.h global.h data.h news.h
  4369. ! nn.o:        nn.c config.h global.h data.h menu.h term.h keymap.h
  4370. ! nnmail.o:    nnmail.c config.h global.h data.h options.h
  4371. ! nntp.o:        nntp.c config.h global.h data.h nntp.h
  4372. ! options.o:    options.c config.h global.h data.h options.h
  4373. ! pack_date.o:    pack_date.c config.h global.h data.h
  4374. ! pack_name.o:    pack_name.c config.h global.h data.h
  4375. ! pack_subject.o:    pack_subject.c config.h global.h data.h 
  4376. ! rc.o:        rc.c config.h global.h data.h term.h
  4377. ! reroute.o:    reroute.c config.h global.h data.h
  4378. ! save.o:        save.c config.h global.h data.h term.h news.h keymap.h
  4379. ! selection.o:    selection.c config.h global.h data.h articles.h
  4380. ! sequence.o:    sequence.c config.h global.h data.h
  4381. ! variable.o:    variable.c config.h global.h data.h 
  4382. ! term.o:        term.c config.h global.h data.h term.h keymap.h
  4383.   
  4384.   * link debugging version
  4385.   
  4386. --- 182,240 ----
  4387.   cvt-help:    cvt-help.c
  4388.       cc -o cvt-help cvt-help.c
  4389.   
  4390. ! active.o:    active.c config.h global.h vararg.h data.h
  4391. ! admin.o:    admin.c config.h global.h vararg.h data.h db.h term.h
  4392. ! answer.o:    answer.c config.h global.h vararg.h data.h news.h term.h \
  4393. !         keymap.h
  4394. ! articles.o:    articles.c config.h global.h vararg.h data.h db.h articles.h \
  4395. !         match.h
  4396. ! collect.o:    collect.c config.h global.h vararg.h data.h db.h news.h
  4397. ! cvt-help.o:    cvt-help.c
  4398. ! date_regexp.o:    date_regexp.c config.h global.h vararg.h data.h
  4399. ! db.o:        db.c config.h global.h vararg.h data.h db.h
  4400. ! decode.o:    decode.c config.h global.h vararg.h data.h
  4401. ! digest.o:    digest.c config.h global.h vararg.h data.h news.h match.h  \
  4402. !         debug.h
  4403. ! execute.o:    execute.c config.h global.h vararg.h data.h term.h
  4404. ! expire.o:    expire.c config.h global.h vararg.h data.h db.h
  4405. ! folder.o:    folder.c config.h global.h vararg.h data.h articles.h news.h \
  4406. !         term.h menu.h
  4407. ! global.o:    global.c config.h global.h vararg.h data.h
  4408. ! group.o:    group.c config.h global.h vararg.h data.h articles.h db.h \
  4409. !         term.h menu.h keymap.h regexp.h
  4410. ! init.o:        init.c config.h global.h vararg.h data.h articles.h term.h \
  4411. !         keymap.h menu.h
  4412. ! keymap.o:    keymap.c config.h global.h vararg.h data.h keymap.h term.h
  4413. ! kill.o:        kill.c config.h global.h vararg.h data.h term.h regexp.h
  4414.   log_entry.o:    log_entry.c
  4415. ! macro.o:    macro.c config.h global.h vararg.h data.h keymap.h term.h
  4416. ! master.o:    master.c config.h global.h vararg.h data.h db.h options.h
  4417. ! match.o:    match.c
  4418. ! menu.o:        menu.c config.h global.h vararg.h data.h articles.h term.h \
  4419. !         keymap.h menu.h regexp.h
  4420. ! more.o:        more.c config.h global.h vararg.h data.h news.h term.h \
  4421. !         menu.h keymap.h regexp.h
  4422. ! news.o:        news.c config.h global.h vararg.h data.h news.h
  4423. ! nn.o:        nn.c config.h global.h vararg.h data.h menu.h term.h \
  4424. !         keymap.h options.h
  4425. ! nnmail.o:    nnmail.c config.h global.h vararg.h data.h options.h
  4426. ! nntp.o:        nntp.c config.h global.h vararg.h data.h nntp.h
  4427. ! options.o:    options.c config.h global.h vararg.h data.h options.h
  4428. ! pack_date.o:    pack_date.c config.h global.h vararg.h data.h
  4429. ! pack_name.o:    pack_name.c config.h global.h vararg.h data.h
  4430. ! pack_subject.o:    pack_subject.c config.h global.h vararg.h data.h
  4431. ! rc.o:        rc.c config.h global.h vararg.h data.h term.h debug.h
  4432. ! regexp.o:    regexp.c config.h global.h vararg.h data.h regexp.h
  4433. ! reroute.o:    reroute.c config.h global.h vararg.h data.h
  4434. ! save.o:        save.c config.h global.h vararg.h data.h term.h keymap.h \
  4435. !         news.h
  4436. ! selection.o:    selection.c config.h global.h vararg.h data.h term.h\
  4437. !          articles.h
  4438. ! sequence.o:    sequence.c config.h global.h vararg.h data.h debug.h
  4439. ! term.o:        term.c config.h global.h vararg.h data.h term.h keymap.h
  4440. ! unshar.o:    unshar.c config.h global.h vararg.h data.h
  4441. ! update.o:    update.c patchlevel.h update.h
  4442. ! variable.o:    variable.c config.h global.h vararg.h data.h
  4443.   
  4444.   * link debugging version
  4445.   
  4446.  
  4447.